Version 1.5.0-dev.3.0

svn merge -r 36623:36817 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@36820 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 7ebd6c6..d4bcb3d 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -8,10 +8,43 @@
 
 import 'package:analysis_server/src/analysis_logger.dart';
 import 'package:analysis_server/src/channel.dart';
+import 'package:analysis_server/src/context_directory_manager.dart';
+import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+
+
+/**
+ * An instance of [DirectoryBasedDartSdk] that is shared between
+ * [AnalysisServer] instances to improve performance.
+ */
+final DirectoryBasedDartSdk SHARED_SDK = DirectoryBasedDartSdk.defaultSdk;
+
+class AnalysisServerContextDirectoryManager extends ContextDirectoryManager {
+  final AnalysisServer analysisServer;
+
+  AnalysisServerContextDirectoryManager(this.analysisServer, ResourceProvider resourceProvider)
+      : super(resourceProvider);
+
+  void addContext(Folder folder, File pubspecFile) {
+    ContextDirectory contextDirectory = new ContextDirectory(
+        analysisServer.defaultSdk, folder, pubspecFile);
+    analysisServer.folderMap[folder] = contextDirectory;
+    analysisServer.addContextToWorkQueue(contextDirectory.context);
+  }
+
+  void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
+    analysisServer.folderMap[contextFolder].context.applyChanges(changeSet);
+  }
+}
 
 /**
  * Instances of the class [AnalysisServer] implement a server that listens on a
@@ -19,24 +52,14 @@
  */
 class AnalysisServer {
   /**
-   * The name of the notification of new errors associated with a source.
-   */
-  static const String ERROR_NOTIFICATION_NAME = 'context.errors';
-
-  /**
-   * The name of the contextId parameter.
-   */
-  static const String CONTEXT_ID_PARAM = 'contextId';
-
-  /**
    * The name of the parameter whose value is a list of errors.
    */
   static const String ERRORS_PARAM = 'errors';
 
   /**
-   * The name of the parameter whose value is a source.
+   * The name of the parameter whose value is a file path.
    */
-  static const String SOURCE_PARAM = 'source';
+  static const String FILE_PARAM = 'file';
 
   /**
    * The event name of the connected notification.
@@ -44,12 +67,23 @@
   static const String CONNECTED_NOTIFICATION = 'server.connected';
 
   /**
+   * The event name of the status notification.
+   */
+  static const String STATUS_NOTIFICATION = 'server.status';
+
+  /**
    * The channel from which requests are received and to which responses should
    * be sent.
    */
   final ServerCommunicationChannel channel;
 
   /**
+   * [ContextDirectoryManager] which handles the mapping from analysis roots
+   * to context directories.
+   */
+  AnalysisServerContextDirectoryManager contextDirectoryManager;
+
+  /**
    * A flag indicating whether the server is running.  When false, contexts
    * will no longer be added to [contextWorkQueue], and [performTask] will
    * discard any tasks it finds on [contextWorkQueue].
@@ -62,15 +96,31 @@
    */
   List<RequestHandler> handlers;
 
-  /**
-   * A table mapping context id's to the analysis contexts associated with them.
-   */
-  final Map<String, AnalysisContext> contextMap = new Map<String, AnalysisContext>();
+  // TODO(scheglov) remove once setAnalysisRoots() is completely implemented
+//  /**
+//   * A table mapping context id's to the analysis contexts associated with them.
+//   */
+//  final Map<String, AnalysisContext> contextMap = new Map<String, AnalysisContext>();
+//
+//  /**
+//   * A table mapping analysis contexts to the context id's associated with them.
+//   */
+//  final Map<AnalysisContext, String> contextIdMap = new Map<AnalysisContext, String>();
 
   /**
-   * A table mapping analysis contexts to the context id's associated with them.
+   * The current default [DartSdk].
    */
-  final Map<AnalysisContext, String> contextIdMap = new Map<AnalysisContext, String>();
+  DartSdk defaultSdk = SHARED_SDK;
+
+  /**
+   * A table mapping [Folder]s to the [ContextDirectory]s associated with them.
+   */
+  final Map<Folder, ContextDirectory> folderMap = <Folder, ContextDirectory>{};
+
+  /**
+   * The context identifier used in the last status notification.
+   */
+  String lastStatusNotificationContextId = null;
 
   /**
    * A list of the analysis contexts for which analysis work needs to be
@@ -91,7 +141,8 @@
    * Initialize a newly created server to receive requests from and send
    * responses to the given [channel].
    */
-  AnalysisServer(this.channel) {
+  AnalysisServer(this.channel, ResourceProvider resourceProvider) {
+    contextDirectoryManager = new AnalysisServerContextDirectoryManager(this, resourceProvider);
     AnalysisEngine.instance.logger = new AnalysisLogger();
     running = true;
     Notification notification = new Notification(CONNECTED_NOTIFICATION);
@@ -172,10 +223,12 @@
     // Look for a context that has work to be done and then perform one task.
     //
     List<ChangeNotice> notices = null;
-    String contextId;
+//    String contextId;
     try {
       AnalysisContext context = contextWorkQueue[0];
-      contextId = contextIdMap[context];
+//      contextId = contextIdMap[context];
+      // TODO(danrubel): Replace with context identifier or similar
+      sendStatusNotification(context.toString());
       AnalysisResult result = context.performAnalysisTask();
       notices = result.changeNotices;
     } finally {
@@ -195,34 +248,150 @@
       }
     }
     if (notices != null) {
-      sendNotices(contextId, notices);
+      sendNotices(notices);
+    } else {
+      sendStatusNotification(null);
     }
   }
 
   /**
    * Send the information in the given list of notices back to the client.
    */
-  void sendNotices(String contextId, List<ChangeNotice> notices) {
+  void sendNotices(List<ChangeNotice> notices) {
     for (int i = 0; i < notices.length; i++) {
       ChangeNotice notice = notices[i];
-      Notification notification = new Notification(ERROR_NOTIFICATION_NAME);
-      notification.setParameter(CONTEXT_ID_PARAM, contextId);
-      notification.setParameter(SOURCE_PARAM, notice.source.encoding);
-      notification.setParameter(ERRORS_PARAM, notice.errors.map(
-          errorToJson).toList());
-      sendNotification(notification);
+      Source source = notice.source;
+      // send "analysis.errors" notification
+      // TODO(scheglov) use subscriptions to determine if we should do this
+      if (!source.isInSystemLibrary) {
+        Notification notification = new Notification(AnalysisDomainHandler.ERRORS_NOTIFICATION);
+        notification.setParameter(FILE_PARAM, source.fullName);
+        notification.setParameter(ERRORS_PARAM, notice.errors.map(errorToJson).toList());
+        sendNotification(notification);
+      }
     }
   }
 
+  /**
+   * Send status notification to the client. The `contextId` indicates
+   * the current context being analyzed or `null` if analysis is complete.
+   */
+  void sendStatusNotification(String contextId) {
+    if (contextId == lastStatusNotificationContextId) {
+      return;
+    }
+    lastStatusNotificationContextId = contextId;
+    Notification notification = new Notification(STATUS_NOTIFICATION);
+    Map<String, Object> analysis = new Map();
+    if (contextId != null) {
+      analysis['analyzing'] = true;
+      // TODO(danrubel): replace contextId with real analysisTarget
+      analysis['analysisTarget'] = contextId;
+    } else {
+      analysis['analyzing'] = false;
+    }
+    notification.params['analysis'] = analysis;
+    channel.sendNotification(notification);
+  }
+
+  /**
+   * Implementation for `analysis.setAnalysisRoots`.
+   *
+   * TODO(scheglov) implement complete projects/contexts semantics.
+   *
+   * The current implementation is intentionally simplified and expected
+   * that only folders are given each given folder corresponds to the exactly
+   * one context.
+   *
+   * So, we can start working in parallel on adding services and improving
+   * projects/contexts support.
+   */
+  void setAnalysisRoots(String requestId,
+                        List<String> includedPaths,
+                        List<String> excludedPaths) {
+    try {
+      contextDirectoryManager.setRoots(includedPaths, excludedPaths);
+    } on UnimplementedError catch (e) {
+      throw new RequestFailure(
+                  new Response.unsupportedFeature(
+                      requestId, e.message));
+    }
+  }
+
+  /**
+   * Implementation for `analysis.updateContent`.
+   */
+  void updateContent(Map<String, ContentChange> changes) {
+    changes.forEach((file, change) {
+      AnalysisContext analysisContext = _getAnalysisContext(file);
+      if (analysisContext != null) {
+        Source source = _getSource(file);
+        if (change.offset == null) {
+          analysisContext.setContents(source, change.content);
+        } else {
+          analysisContext.setChangedContents(source, change.content,
+              change.offset, change.oldLength, change.newLength);
+        }
+        addContextToWorkQueue(analysisContext);
+      }
+    });
+  }
+
+  /**
+   * Return the [AnalysisContext] that is used to analyze the given [path].
+   * Return `null` if there is no such context.
+   */
+  AnalysisContext _getAnalysisContext(String path) {
+    for (Folder folder in folderMap.keys) {
+      if (path.startsWith(folder.path)) {
+        return folderMap[folder].context;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the [Source] of the Dart file with the given [path].
+   */
+  Source _getSource(String path) {
+    File file = contextDirectoryManager.resourceProvider.getResource(path);
+    return file.createSource(UriKind.FILE_URI);
+  }
+
+  /**
+   * Return the [CompilationUnit] of the Dart file with the given [path].
+   * Return `null` if the file is not a part of any context.
+   */
+  CompilationUnit test_getResolvedCompilationUnit(String path) {
+    // prepare AnalysisContext
+    AnalysisContext context = _getAnalysisContext(path);
+    if (context == null) {
+      return null;
+    }
+    // prepare sources
+    Source unitSource = _getSource(path);
+    List<Source> librarySources = context.getLibrariesContaining(unitSource);
+    if (librarySources.isEmpty) {
+      return null;
+    }
+    // get a resolved unit
+    return context.getResolvedCompilationUnit2(unitSource, librarySources[0]);
+  }
+
+  /**
+   * Return `true` if all tasks are finished in this [AnalysisServer].
+   */
+  bool test_areTasksFinished() {
+    return contextWorkQueue.isEmpty;
+  }
+
   static Map<String, Object> errorToJson(AnalysisError analysisError) {
     // TODO(paulberry): move this function into the AnalysisError class.
-
-    // TODO(paulberry): we really shouldn't be exposing errorCode.ordinal
-    // outside the analyzer, since the ordinal numbers change whenever we
-    // regenerate the analysis engine.
+    ErrorCode errorCode = analysisError.errorCode;
     Map<String, Object> result = {
-      'source': analysisError.source.encoding,
-      'errorCode': (analysisError.errorCode as Enum).ordinal,
+      'file': analysisError.source.fullName,
+      // TODO(scheglov) add Enum.fullName ?
+      'errorCode': '${errorCode.runtimeType}.${(errorCode as Enum).name}',
       'offset': analysisError.offset,
       'length': analysisError.length,
       'message': analysisError.message
@@ -265,6 +434,50 @@
 
 
 /**
+ * Instances of [ContextDirectory] represents a [Folder] associated with an
+ * analysis context.  The folder may or may not contain a Pub `pubspec.yaml`.
+ *
+ * TODO(scheglov) implement complete projects/contexts semantics.
+ *
+ * This class is intentionally simplified to serve as a base to start working
+ * on services while work on complete semantics is being done in parallel.
+ */
+class ContextDirectory {
+  /**
+   * The root [Folder] of this [ContextDirectory].
+   */
+  final Folder _folder;
+
+  /**
+   * The `pubspec.yaml` file in [_folder], or null if there isn't one.
+   */
+  File _pubspecFile;
+
+  /**
+   * The [AnalysisContext] of this [_folder].
+   */
+  AnalysisContext _context;
+
+  ContextDirectory(DartSdk sdk, this._folder, this._pubspecFile) {
+    // create AnalysisContext
+    _context = AnalysisEngine.instance.createAnalysisContext();
+    // TODO(scheglov) replace FileUriResolver with an Resource based resolver
+    // TODO(scheglov) create packages resolver
+    _context.sourceFactory = new SourceFactory([
+      new DartUriResolver(sdk),
+      new FileUriResolver(),
+      // new PackageUriResolver(),
+    ]);
+  }
+
+  /**
+   * Return the [AnalysisContext] of this folder.
+   */
+  AnalysisContext get context => _context;
+}
+
+
+/**
  * An enumeration of the services provided by the server domain.
  */
 class ServerService extends Enum2<ServerService> {
diff --git a/pkg/analysis_server/lib/src/context_directory_manager.dart b/pkg/analysis_server/lib/src/context_directory_manager.dart
new file mode 100644
index 0000000..c171798
--- /dev/null
+++ b/pkg/analysis_server/lib/src/context_directory_manager.dart
@@ -0,0 +1,171 @@
+// 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 context.directory.manager;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:watcher/watcher.dart';
+
+/**
+ * Information tracked by the [ContextDirectoryManager] for each context.
+ */
+class _ContextDirectoryInfo {
+  /**
+   * Stream subscription we are using to watch the context's directory for
+   * changes.
+   */
+  StreamSubscription<WatchEvent> changeSubscription;
+
+  /**
+   * Map from full path to the [Source] object, for each source that has been
+   * added to the context.
+   */
+  Map<String, Source> sources = <String, Source>{};
+}
+
+/**
+ * Class that maintains a mapping from included/excluded paths to a set of
+ * folders that should correspond to analysis contexts.
+ */
+abstract class ContextDirectoryManager {
+  /**
+   * [_ContextDirectoryInfo] object for each included directory in the most
+   * recent successful call to [setRoots].
+   */
+  Map<Folder, _ContextDirectoryInfo> _currentDirectoryInfo =
+      <Folder, _ContextDirectoryInfo>{};
+
+  /**
+   * The [ResourceProvider] using which paths are converted into [Resource]s.
+   */
+  final ResourceProvider resourceProvider;
+
+  ContextDirectoryManager(this.resourceProvider);
+
+  /**
+   * Change the set of paths which should be used as starting points to
+   * determine the context directories.
+   */
+  void setRoots(List<String> includedPaths,
+                List<String> excludedPaths) {
+    // included
+    Set<Folder> includedFolders = new Set<Folder>();
+    for (int i = 0; i < includedPaths.length; i++) {
+      String path = includedPaths[i];
+      Resource resource = resourceProvider.getResource(path);
+      if (resource is Folder) {
+        includedFolders.add(resource);
+      } else {
+        // TODO(scheglov) implemented separate files analysis
+        throw new UnimplementedError(
+            '$path is not a folder. '
+            'Only support for folder analysis is implemented currently.');
+      }
+    }
+    // excluded
+    // TODO(scheglov) remove when implemented
+    if (excludedPaths.isNotEmpty) {
+      throw new UnimplementedError(
+          'Excluded paths are not supported yet');
+    }
+    Set<Folder> excludedFolders = new Set<Folder>();
+    // diff
+    Set<Folder> currentFolders = _currentDirectoryInfo.keys.toSet();
+    Set<Folder> newFolders = includedFolders.difference(currentFolders);
+    Set<Folder> oldFolders = currentFolders.difference(includedFolders);
+    // remove old contexts
+    for (Folder folder in oldFolders) {
+      // TODO(scheglov) implement
+    }
+    // add new contexts
+    for (Folder folder in newFolders) {
+      _ContextDirectoryInfo info = new _ContextDirectoryInfo();
+      _currentDirectoryInfo[folder] = info;
+      info.changeSubscription = folder.changes.listen((WatchEvent event) {
+        _handleWatchEvent(folder, info, event);
+      });
+      File pubspecFile = folder.getChild('pubspec.yaml');
+      addContext(folder, pubspecFile.exists ? pubspecFile : null);
+      ChangeSet changeSet = new ChangeSet();
+      _addSourceFiles(changeSet, folder, info);
+      applyChangesToContext(folder, changeSet);
+    }
+  }
+
+  void _handleWatchEvent(Folder folder, _ContextDirectoryInfo info, WatchEvent event) {
+    switch (event.type) {
+      case ChangeType.ADD:
+        // TODO(paulberry): handle adding pubspec.yaml
+        if (_shouldFileBeAnalyzed(event.path)) {
+          ChangeSet changeSet = new ChangeSet();
+          Resource resource = resourceProvider.getResource(event.path);
+          // If the file went away and was replaced by a folder before we
+          // had a chance to process the event, resource might be a Folder.  In
+          // that case don't add it.
+          if (resource is File) {
+            File file = resource;
+            Source source = file.createSource(UriKind.FILE_URI);
+            changeSet.addedSource(source);
+            applyChangesToContext(folder, changeSet);
+            info.sources[event.path]= source;
+          }
+        }
+        break;
+      case ChangeType.REMOVE:
+        // TODO(paulberry): handle removing pubspec.yaml
+        Source source = info.sources[event.path];
+        if (source != null) {
+          ChangeSet changeSet = new ChangeSet();
+          changeSet.removedSource(source);
+          applyChangesToContext(folder, changeSet);
+          info.sources.remove(event.path);
+        }
+        break;
+      case ChangeType.MODIFY:
+        // TODO(paulberry): handle modification events
+        break;
+    }
+  }
+
+  /**
+   * Resursively adds all Dart and HTML files to the [changeSet].
+   */
+  static void _addSourceFiles(ChangeSet changeSet, Folder folder, _ContextDirectoryInfo info) {
+    List<Resource> children = folder.getChildren();
+    for (Resource child in children) {
+      if (child is File) {
+        if (_shouldFileBeAnalyzed(child.path)) {
+          Source source = child.createSource(UriKind.FILE_URI);
+          changeSet.addedSource(source);
+          info.sources[child.path] = source;
+        }
+      } else if (child is Folder) {
+        _addSourceFiles(changeSet, child, info);
+      }
+    }
+  }
+
+  static bool _shouldFileBeAnalyzed(String path) {
+    return AnalysisEngine.isDartFileName(path)
+            || AnalysisEngine.isHtmlFileName(path);
+  }
+
+  /**
+   * Called when a new context needs to be created.  If the context is
+   * associated with a pubspec file, that file is passed in [pubspecFile];
+   * otherwise it is null.
+   */
+  void addContext(Folder folder, File pubspecFile);
+
+  /**
+   * Called when the set of files associated with a context have changed (or
+   * some of those files have been modified).  [changeSet] is the set of
+   * changes that need to be applied to the context.
+   */
+  void applyChangesToContext(Folder contextFolder, ChangeSet changeSet);
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index d83c1d3..c0d2983 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -78,6 +78,11 @@
   static const String ADDED_PARAM = 'added';
 
   /**
+   * The name of the `content` parameter.
+   */
+  static const String CONTENT_PARAM = 'content';
+
+  /**
    * The name of the `default` parameter.
    */
   static const String DEFAULT_PARAM = 'default';
@@ -118,11 +123,21 @@
   static const String LENGTH_PARAM = 'length';
 
   /**
+   * The name of the `newLength` parameter.
+   */
+  static const String NEW_LENGTH_PARAM = 'newLength';
+
+  /**
    * The name of the `offset` parameter.
    */
   static const String OFFSET_PARAM = 'offset';
 
   /**
+   * The name of the `oldLength` parameter.
+   */
+  static const String OLD_LENGTH_PARAM = 'oldLength';
+
+  /**
    * The name of the `options` parameter.
    */
   static const String OPTIONS_PARAM = 'options';
@@ -200,8 +215,15 @@
   }
 
   Response setAnalysisRoots(Request request) {
-    // TODO(scheglov) implement
-    return null;
+    // included
+    RequestDatum includedDatum = request.getRequiredParameter(INCLUDED_PARAM);
+    List<String> includedPaths = includedDatum.asStringList();
+    // excluded
+    RequestDatum excludedDatum = request.getRequiredParameter(EXCLUDED_PARAM);
+    List<String> excludedPaths = excludedDatum.asStringList();
+    // continue in server
+    server.setAnalysisRoots(request.id, includedPaths, excludedPaths);
+    return new Response(request.id);
   }
 
   Response setPriorityFiles(Request request) {
@@ -215,8 +237,20 @@
   }
 
   Response updateContent(Request request) {
-    // TODO(scheglov) implement
-    return null;
+    var changes = new Map<String, ContentChange>();
+    RequestDatum filesDatum = request.getRequiredParameter(FILES_PARAM);
+    filesDatum.forEachMap((file, changeDatum) {
+      var change = new ContentChange();
+      change.content = changeDatum[CONTENT_PARAM].asString();
+      if (changeDatum.hasKey(OFFSET_PARAM)) {
+        change.offset = changeDatum[OFFSET_PARAM].asInt();
+        change.oldLength = changeDatum[OLD_LENGTH_PARAM].asInt();
+        change.newLength = changeDatum[NEW_LENGTH_PARAM].asInt();
+      }
+      changes[file] = change;
+    });
+    server.updateContent(changes);
+    return new Response(request.id);
   }
 
   Response updateOptions(Request request) {
@@ -229,3 +263,14 @@
     return null;
   }
 }
+
+
+/**
+ * A description of the change to the content of a file.
+ */
+class ContentChange {
+  String content;
+  int offset;
+  int oldLength;
+  int newLength;
+}
diff --git a/pkg/analysis_server/lib/src/domain_context.dart b/pkg/analysis_server/lib/src/domain_context.dart
index 46ad6fa..d7ff3ff 100644
--- a/pkg/analysis_server/lib/src/domain_context.dart
+++ b/pkg/analysis_server/lib/src/domain_context.dart
@@ -12,6 +12,8 @@
 /**
  * Instances of the class [ContextDomainHandler] implement a [RequestHandler]
  * that handles requests in the context domain.
+ *
+ * TODO(scheglov) this class is replaces with [AnalysisDomainHandler].
  */
 class ContextDomainHandler implements RequestHandler {
   /**
@@ -263,11 +265,13 @@
    * the specified context does not exist.
    */
   AnalysisContext getAnalysisContext(Request request) {
-    String contextId = request.getRequiredParameter(CONTEXT_ID_PARAM).asString();
-    AnalysisContext context = server.contextMap[contextId];
-    if (context == null) {
-      throw new RequestFailure(new Response.contextDoesNotExist(request));
-    }
-    return context;
+    // TODO(scheglov) remove it after migrating to the new API
+    return null;
+//    String contextId = request.getRequiredParameter(CONTEXT_ID_PARAM).asString();
+//    AnalysisContext context = server.contextMap[contextId];
+//    if (context == null) {
+//      throw new RequestFailure(new Response.contextDoesNotExist(request));
+//    }
+//    return context;
   }
 }
diff --git a/pkg/analysis_server/lib/src/generated/service_computers.dart b/pkg/analysis_server/lib/src/generated/service_computers.dart
index 8f8d10f..edb8775 100644
--- a/pkg/analysis_server/lib/src/generated/service_computers.dart
+++ b/pkg/analysis_server/lib/src/generated/service_computers.dart
@@ -18,6 +18,51 @@
 import 'service_interfaces.dart' as psi;
 
 /**
+ * A concrete implementation of [CompletionSuggestion].
+ */
+class CompletionSuggestionImpl implements psi.CompletionSuggestion {
+  final String completion;
+
+  final String declaringType;
+
+  final String elementDocSummary;
+
+  final String elementDocDetails;
+
+  final psi.CompletionSuggestionKind kind;
+
+  final int location;
+
+  final String parameterName;
+
+  final List<String> parameterNames;
+
+  final String parameterType;
+
+  final List<String> parameterTypes;
+
+  final int positionalParameterCount;
+
+  final int relevance;
+
+  final int replacementLength;
+
+  final int replacementLengthIdentifier;
+
+  final String returnType;
+
+  final bool hasNamed;
+
+  final bool hasPositional;
+
+  final bool isDeprecated;
+
+  final bool isPotentialMatch;
+
+  CompletionSuggestionImpl(this.elementDocSummary, this.elementDocDetails, this.completion, this.declaringType, this.kind, this.location, this.parameterName, this.parameterNames, this.parameterType, this.parameterTypes, this.positionalParameterCount, this.relevance, this.replacementLength, this.replacementLengthIdentifier, this.returnType, this.hasNamed, this.hasPositional, this.isDeprecated, this.isPotentialMatch);
+}
+
+/**
  * A computer for [HighlightRegion]s in a Dart [CompilationUnit].
  */
 class DartUnitHighlightsComputer {
@@ -306,11 +351,13 @@
  * A computer for [NavigationRegion]s in a Dart [CompilationUnit].
  */
 class DartUnitNavigationComputer {
+  final String _contextId;
+
   final CompilationUnit _unit;
 
   List<psi.NavigationRegion> _regions = [];
 
-  DartUnitNavigationComputer(this._unit);
+  DartUnitNavigationComputer(this._contextId, this._unit);
 
   /**
    * Returns the computed [NavigationRegion]s, not `null`.
@@ -332,6 +379,18 @@
     _regions.add(new NavigationRegionImpl(offset, length, <psi.Element> [target]));
   }
 
+  void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, pae.Element element) {
+    int offset = a.offset;
+    int length = b.end - offset;
+    _addRegion(offset, length, element);
+  }
+
+  void _addRegion_nodeStart_nodeStart(AstNode a, AstNode b, pae.Element element) {
+    int offset = a.offset;
+    int length = b.offset - offset;
+    _addRegion(offset, length, element);
+  }
+
   void _addRegion_tokenStart_nodeEnd(Token a, AstNode b, pae.Element element) {
     int offset = a.offset;
     int length = b.end - offset;
@@ -369,7 +428,7 @@
     if (element is pae.FieldFormalParameterElement) {
       element = (element as pae.FieldFormalParameterElement).field;
     }
-    return ElementImpl.create(element);
+    return ElementImpl.create(_contextId, element);
   }
 }
 
@@ -379,11 +438,13 @@
 class DartUnitOutlineComputer {
   static String _UNITTEST_LIBRARY = "unittest";
 
+  final String _contextId;
+
   final Source _source;
 
   final CompilationUnit _unit;
 
-  DartUnitOutlineComputer(this._source, this._unit);
+  DartUnitOutlineComputer(this._contextId, this._source, this._unit);
 
   /**
    * Returns the computed [Outline]s, not `null`.
@@ -408,7 +469,7 @@
               TypeName fieldType = fields.type;
               String fieldTypeName = fieldType != null ? fieldType.toSource() : "";
               for (VariableDeclaration field in fields.variables) {
-                _newField(classOutline, classChildren, fieldTypeName, field, fieldDeclaration.isStatic);
+                _newVariableOutline(classOutline, classChildren, fieldTypeName, psi.ElementKind.FIELD, field, fieldDeclaration.isStatic);
               }
             }
           }
@@ -419,6 +480,17 @@
         }
         classOutline.children = new List.from(classChildren);
       }
+      if (unitMember is TopLevelVariableDeclaration) {
+        TopLevelVariableDeclaration fieldDeclaration = unitMember;
+        VariableDeclarationList fields = fieldDeclaration.variables;
+        if (fields != null) {
+          TypeName fieldType = fields.type;
+          String fieldTypeName = fieldType != null ? fieldType.toSource() : "";
+          for (VariableDeclaration field in fields.variables) {
+            _newVariableOutline(unitOutline, unitChildren, fieldTypeName, psi.ElementKind.TOP_LEVEL_VARIABLE, field, false);
+          }
+        }
+      }
       if (unitMember is FunctionDeclaration) {
         FunctionDeclaration functionDeclaration = unitMember;
         _newFunctionOutline(unitOutline, unitChildren, functionDeclaration);
@@ -475,7 +547,7 @@
         // add a new outline
         FunctionExpression functionExpression = arguments[1] as FunctionExpression;
         SourceRegionImpl sourceRegion = new SourceRegionImpl(node.offset, node.length);
-        ElementImpl element = new ElementImpl(null, _source, unitTestKind, name, nameOffset, nameLength, null, null, false, false, false);
+        ElementImpl element = new ElementImpl(_contextId, null, _source, unitTestKind, name, nameOffset, nameLength, null, null, false, false, false);
         OutlineImpl outline = new OutlineImpl(parent, element, sourceRegion);
         children.add(outline);
         _addLocalFunctionOutlines(outline, functionExpression.body);
@@ -554,7 +626,7 @@
   OutlineImpl _newClassOutline(psi.Outline unitOutline, List<psi.Outline> unitChildren, ClassDeclaration classDeclaration) {
     SimpleIdentifier nameNode = classDeclaration.name;
     String name = nameNode.name;
-    ElementImpl element = new ElementImpl(ElementImpl.createId(classDeclaration.element), _source, psi.ElementKind.CLASS, name, nameNode.offset, name.length, null, null, classDeclaration.isAbstract, false, StringUtilities.startsWithChar(name, 0x5F));
+    ElementImpl element = new ElementImpl(_contextId, ElementImpl.createId(classDeclaration.element), _source, psi.ElementKind.CLASS, name, nameNode.offset, name.length, null, null, classDeclaration.isAbstract, false, StringUtilities.startsWithChar(name, 0x5F));
     psi.SourceRegion sourceRegion = _getSourceRegion(classDeclaration);
     OutlineImpl outline = new OutlineImpl(unitOutline, element, sourceRegion);
     unitChildren.add(outline);
@@ -564,7 +636,7 @@
   void _newClassTypeAlias(psi.Outline unitOutline, List<psi.Outline> unitChildren, ClassTypeAlias alias) {
     SimpleIdentifier nameNode = alias.name;
     String name = nameNode.name;
-    ElementImpl element = new ElementImpl(ElementImpl.createId(alias.element), _source, psi.ElementKind.CLASS_TYPE_ALIAS, name, nameNode.offset, nameNode.length, null, null, alias.isAbstract, false, StringUtilities.startsWithChar(name, 0x5F));
+    ElementImpl element = new ElementImpl(_contextId, ElementImpl.createId(alias.element), _source, psi.ElementKind.CLASS_TYPE_ALIAS, name, nameNode.offset, nameNode.length, null, null, alias.isAbstract, false, StringUtilities.startsWithChar(name, 0x5F));
     psi.SourceRegion sourceRegion = _getSourceRegion(alias);
     OutlineImpl outline = new OutlineImpl(unitOutline, element, sourceRegion);
     unitChildren.add(outline);
@@ -585,22 +657,13 @@
       length = constructorNameNode.length;
     }
     FormalParameterList parameters = constructorDeclaration.parameters;
-    ElementImpl element = new ElementImpl(ElementImpl.createId(constructorDeclaration.element), _source, psi.ElementKind.CONSTRUCTOR, name, offset, length, parameters != null ? parameters.toSource() : "", null, false, false, isPrivate);
+    ElementImpl element = new ElementImpl(_contextId, ElementImpl.createId(constructorDeclaration.element), _source, psi.ElementKind.CONSTRUCTOR, name, offset, length, parameters != null ? parameters.toSource() : "", null, false, false, isPrivate);
     psi.SourceRegion sourceRegion = _getSourceRegion(constructorDeclaration);
     OutlineImpl outline = new OutlineImpl(classOutline, element, sourceRegion);
     children.add(outline);
     _addLocalFunctionOutlines(outline, constructorDeclaration.body);
   }
 
-  void _newField(OutlineImpl classOutline, List<psi.Outline> children, String fieldTypeName, VariableDeclaration field, bool isStatic) {
-    SimpleIdentifier nameNode = field.name;
-    String name = nameNode.name;
-    ElementImpl element = new ElementImpl(ElementImpl.createId(field.element), _source, psi.ElementKind.FIELD, name, nameNode.offset, nameNode.length, null, fieldTypeName, false, isStatic, StringUtilities.startsWithChar(name, 0x5F));
-    psi.SourceRegion sourceRegion = _getSourceRegion(field);
-    OutlineImpl outline = new OutlineImpl(classOutline, element, sourceRegion);
-    children.add(outline);
-  }
-
   void _newFunctionOutline(psi.Outline parent, List<psi.Outline> children, FunctionDeclaration functionDeclaration) {
     TypeName returnType = functionDeclaration.returnType;
     SimpleIdentifier nameNode = functionDeclaration.name;
@@ -615,7 +678,7 @@
     } else {
       kind = psi.ElementKind.FUNCTION;
     }
-    ElementImpl element = new ElementImpl(ElementImpl.createId(functionDeclaration.element), _source, kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, false, StringUtilities.startsWithChar(name, 0x5F));
+    ElementImpl element = new ElementImpl(_contextId, ElementImpl.createId(functionDeclaration.element), _source, kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, false, StringUtilities.startsWithChar(name, 0x5F));
     psi.SourceRegion sourceRegion = _getSourceRegion(functionDeclaration);
     OutlineImpl outline = new OutlineImpl(parent, element, sourceRegion);
     children.add(outline);
@@ -627,7 +690,7 @@
     SimpleIdentifier nameNode = alias.name;
     String name = nameNode.name;
     FormalParameterList parameters = alias.parameters;
-    ElementImpl element = new ElementImpl(ElementImpl.createId(alias.element), _source, psi.ElementKind.FUNCTION_TYPE_ALIAS, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, false, StringUtilities.startsWithChar(name, 0x5F));
+    ElementImpl element = new ElementImpl(_contextId, ElementImpl.createId(alias.element), _source, psi.ElementKind.FUNCTION_TYPE_ALIAS, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", false, false, StringUtilities.startsWithChar(name, 0x5F));
     psi.SourceRegion sourceRegion = _getSourceRegion(alias);
     OutlineImpl outline = new OutlineImpl(unitOutline, element, sourceRegion);
     unitChildren.add(outline);
@@ -646,7 +709,7 @@
     } else {
       kind = psi.ElementKind.METHOD;
     }
-    ElementImpl element = new ElementImpl(ElementImpl.createId(methodDeclaration.element), _source, kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", methodDeclaration.isAbstract, methodDeclaration.isStatic, StringUtilities.startsWithChar(name, 0x5F));
+    ElementImpl element = new ElementImpl(_contextId, ElementImpl.createId(methodDeclaration.element), _source, kind, name, nameNode.offset, nameNode.length, parameters != null ? parameters.toSource() : "", returnType != null ? returnType.toSource() : "", methodDeclaration.isAbstract, methodDeclaration.isStatic, StringUtilities.startsWithChar(name, 0x5F));
     psi.SourceRegion sourceRegion = _getSourceRegion(methodDeclaration);
     OutlineImpl outline = new OutlineImpl(classOutline, element, sourceRegion);
     children.add(outline);
@@ -654,9 +717,18 @@
   }
 
   OutlineImpl _newUnitOutline() {
-    ElementImpl element = new ElementImpl(ElementImpl.createId(_unit.element), _source, psi.ElementKind.COMPILATION_UNIT, null, 0, 0, null, null, false, false, false);
+    ElementImpl element = new ElementImpl(_contextId, ElementImpl.createId(_unit.element), _source, psi.ElementKind.COMPILATION_UNIT, null, 0, 0, null, null, false, false, false);
     return new OutlineImpl(null, element, new SourceRegionImpl(_unit.offset, _unit.length));
   }
+
+  void _newVariableOutline(OutlineImpl classOutline, List<psi.Outline> children, String typeName, psi.ElementKind kind, VariableDeclaration variable, bool isStatic) {
+    SimpleIdentifier nameNode = variable.name;
+    String name = nameNode.name;
+    ElementImpl element = new ElementImpl(_contextId, ElementImpl.createId(variable.element), _source, kind, name, nameNode.offset, nameNode.length, null, typeName, false, isStatic, StringUtilities.startsWithChar(name, 0x5F));
+    psi.SourceRegion sourceRegion = _getSourceRegion(variable);
+    OutlineImpl outline = new OutlineImpl(classOutline, element, sourceRegion);
+    children.add(outline);
+  }
 }
 
 /**
@@ -667,7 +739,10 @@
    * Creates an [ElementImpl] instance for the given
    * [com.google.dart.engine.element.Element].
    */
-  static ElementImpl create(pae.Element element) {
+  static ElementImpl create(String contextId, pae.Element element) {
+    if (element == null) {
+      return null;
+    }
     // prepare name
     String name = element.displayName;
     int nameOffset = element.nameOffset;
@@ -695,6 +770,8 @@
         }
       } else if (element.kind == pae.ElementKind.FUNCTION) {
         outlineKind = psi.ElementKind.FUNCTION;
+      } else if (element.kind == pae.ElementKind.GETTER) {
+        outlineKind = psi.ElementKind.GETTER;
       } else if (element.kind == pae.ElementKind.FUNCTION_TYPE_ALIAS) {
         outlineKind = psi.ElementKind.FUNCTION_TYPE_ALIAS;
       } else if (element.kind == pae.ElementKind.LIBRARY) {
@@ -702,6 +779,8 @@
       } else if (element.kind == pae.ElementKind.METHOD) {
         outlineKind = psi.ElementKind.METHOD;
         isAbstract = (element as pae.MethodElement).isAbstract;
+      } else if (element.kind == pae.ElementKind.SETTER) {
+        outlineKind = psi.ElementKind.SETTER;
       } else {
         outlineKind = psi.ElementKind.UNKNOWN;
       }
@@ -731,7 +810,7 @@
       }
     }
     // new element
-    return new ElementImpl(createId(element), element.source, outlineKind, name, nameOffset, nameLength, parameters, returnType, isAbstract, isStatic, isPrivate);
+    return new ElementImpl(contextId, createId(element), element.source, outlineKind, name, nameOffset, nameLength, parameters, returnType, isAbstract, isStatic, isPrivate);
   }
 
   /**
@@ -744,6 +823,8 @@
     return element.location.encoding;
   }
 
+  final String contextId;
+
   final String id;
 
   final Source source;
@@ -766,7 +847,7 @@
 
   final bool isStatic;
 
-  ElementImpl(this.id, this.source, this.kind, this.name, this.offset, this.length, this.parameters, this.returnType, this.isAbstract, this.isStatic, this.isPrivate);
+  ElementImpl(this.contextId, this.id, this.source, this.kind, this.name, this.offset, this.length, this.parameters, this.returnType, this.isAbstract, this.isStatic, this.isPrivate);
 
   @override
   bool operator ==(Object obj) {
@@ -808,6 +889,22 @@
   }
 }
 
+class GeneralizingElementVisitor_TypeHierarchyComputer_findEngineElement extends pae.GeneralizingElementVisitor<Object> {
+  int nameOffset = 0;
+
+  List<pae.Element> result;
+
+  GeneralizingElementVisitor_TypeHierarchyComputer_findEngineElement(this.nameOffset, this.result) : super();
+
+  @override
+  Object visitElement(pae.Element element) {
+    if (element.nameOffset == nameOffset) {
+      result[0] = element;
+    }
+    return super.visitElement(element);
+  }
+}
+
 /**
  * A concrete implementation of [HighlightRegion].
  */
@@ -1082,6 +1179,22 @@
   }
 
   @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    // associate constructor with "T" or "T.name"
+    {
+      AstNode firstNode = node.returnType;
+      AstNode lastNode = node.name;
+      if (lastNode == null) {
+        lastNode = firstNode;
+      }
+      if (firstNode != null && lastNode != null) {
+        DartUnitNavigationComputer_this._addRegion_nodeStart_nodeEnd(firstNode, lastNode, node.element);
+      }
+    }
+    return super.visitConstructorDeclaration(node);
+  }
+
+  @override
   Object visitExportDirective(ExportDirective node) {
     pae.ExportElement exportElement = node.element;
     if (exportElement != null) {
@@ -1108,6 +1221,12 @@
   }
 
   @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    DartUnitNavigationComputer_this._addRegion_nodeStart_nodeStart(node, node.argumentList, node.staticElement);
+    return super.visitInstanceCreationExpression(node);
+  }
+
+  @override
   Object visitPartDirective(PartDirective node) {
     DartUnitNavigationComputer_this._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, node.element);
     return super.visitPartDirective(node);
@@ -1133,7 +1252,10 @@
 
   @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
-    DartUnitNavigationComputer_this._addRegionForNode(node, node.bestElement);
+    if (node.parent is ConstructorDeclaration) {
+    } else {
+      DartUnitNavigationComputer_this._addRegionForNode(node, node.bestElement);
+    }
     return super.visitSimpleIdentifier(node);
   }
 }
@@ -1177,7 +1299,9 @@
 
   final int length;
 
-  SearchResultImpl(this.path, this.source, this.kind, this.offset, this.length);
+  final bool isPotential;
+
+  SearchResultImpl(this.path, this.source, this.kind, this.offset, this.length, this.isPotential);
 
   @override
   String toString() {
@@ -1190,6 +1314,8 @@
     builder.append(offset);
     builder.append(", length=");
     builder.append(length);
+    builder.append(", potential=");
+    builder.append(isPotential);
     builder.append(", path=");
     builder.append(path);
     builder.append("]");
@@ -1235,4 +1361,46 @@
     builder.append("]");
     return builder.toString();
   }
+}
+
+/**
+ * A concrete implementation of [TypeHierarchyItem].
+ */
+class TypeHierarchyItemImpl implements psi.TypeHierarchyItem {
+  final String name;
+
+  final psi.Element classElement;
+
+  final psi.Element memberElement;
+
+  final psi.TypeHierarchyItem extendedType;
+
+  final List<psi.TypeHierarchyItem> mixedTypes;
+
+  final List<psi.TypeHierarchyItem> implementedTypes;
+
+  List<psi.TypeHierarchyItem> subTypes = psi.TypeHierarchyItem.EMPTY_ARRAY;
+
+  TypeHierarchyItemImpl(this.name, this.classElement, this.memberElement, this.extendedType, this.mixedTypes, this.implementedTypes);
+
+  @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append("[name=");
+    builder.append(name);
+    builder.append(", classElement=");
+    builder.append(classElement);
+    builder.append(", memberElement=");
+    builder.append(memberElement);
+    builder.append(", extendedType=");
+    builder.append(extendedType);
+    builder.append(", mixedTypes=[");
+    builder.append(StringUtils.join(mixedTypes, ", "));
+    builder.append("], implementedTypes=[");
+    builder.append(StringUtils.join(implementedTypes, ", "));
+    builder.append("], subTypes=[");
+    builder.append(StringUtils.join(subTypes, ", "));
+    builder.append("]]");
+    return builder.toString();
+  }
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/generated/service_interfaces.dart b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
index dae1c78..07643a9 100644
--- a/pkg/analysis_server/lib/src/generated/service_interfaces.dart
+++ b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
@@ -9,7 +9,154 @@
 
 import 'package:analyzer/src/generated/java_core.dart' show Enum, StringUtils;
 import 'package:analyzer/src/generated/source.dart' show Source;
-import 'package:analysis_services/src/generated/proposal.dart';
+import 'package:analysis_services/src/generated/change.dart' show SourceChange;
+
+/**
+ * The interface `AssistsConsumer` defines the behavior of objects that consume assists
+ * [SourceChange]s.
+ */
+abstract class AssistsConsumer implements Consumer {
+  /**
+   * A set of [SourceChange]s that have been computed.
+   *
+   * @param proposals an array of computed [SourceChange]s
+   * @param isLastResult is `true` if this is the last set of results
+   */
+  void computedSourceChanges(List<SourceChange> sourceChanges, bool isLastResult);
+}
+
+/**
+ * The interface `CompletionSuggestion` defines the behavior of objects representing a
+ * completion suggestions.
+ */
+abstract class CompletionSuggestion {
+  static final int RELEVANCE_LOW = 0;
+
+  static final int RELEVANCE_DEFAULT = 10;
+
+  static final int RELEVANCE_HIGH = 20;
+
+  /**
+   * An empty array of suggestions.
+   */
+  static final List<CompletionSuggestion> EMPTY_ARRAY = new List<CompletionSuggestion>(0);
+
+  /**
+   * This character is used to specify location of the cursor after completion.
+   */
+  static final int CURSOR_MARKER = 0x2758;
+
+  String get completion;
+
+  String get declaringType;
+
+  String get elementDocDetails;
+
+  String get elementDocSummary;
+
+  CompletionSuggestionKind get kind;
+
+  int get location;
+
+  String get parameterName;
+
+  List<String> get parameterNames;
+
+  String get parameterType;
+
+  List<String> get parameterTypes;
+
+  int get positionalParameterCount;
+
+  int get relevance;
+
+  int get replacementLength;
+
+  int get replacementLengthIdentifier;
+
+  String get returnType;
+
+  bool get hasNamed;
+
+  bool get hasPositional;
+
+  bool get isDeprecated;
+
+  bool get isPotentialMatch;
+}
+
+/**
+ * The various kinds of completion proposals. Each specifies the kind of completion to be created,
+ * corresponding to different syntactical elements.
+ */
+class CompletionSuggestionKind extends Enum<CompletionSuggestionKind> {
+  static const CompletionSuggestionKind NONE = const CompletionSuggestionKind('NONE', 0);
+
+  static const CompletionSuggestionKind CLASS = const CompletionSuggestionKind('CLASS', 1);
+
+  static const CompletionSuggestionKind CLASS_ALIAS = const CompletionSuggestionKind('CLASS_ALIAS', 2);
+
+  static const CompletionSuggestionKind CONSTRUCTOR = const CompletionSuggestionKind('CONSTRUCTOR', 3);
+
+  static const CompletionSuggestionKind FIELD = const CompletionSuggestionKind('FIELD', 4);
+
+  static const CompletionSuggestionKind FUNCTION = const CompletionSuggestionKind('FUNCTION', 5);
+
+  static const CompletionSuggestionKind FUNCTION_ALIAS = const CompletionSuggestionKind('FUNCTION_ALIAS', 6);
+
+  static const CompletionSuggestionKind GETTER = const CompletionSuggestionKind('GETTER', 7);
+
+  static const CompletionSuggestionKind IMPORT = const CompletionSuggestionKind('IMPORT', 8);
+
+  static const CompletionSuggestionKind LIBRARY_PREFIX = const CompletionSuggestionKind('LIBRARY_PREFIX', 9);
+
+  static const CompletionSuggestionKind METHOD = const CompletionSuggestionKind('METHOD', 10);
+
+  static const CompletionSuggestionKind METHOD_NAME = const CompletionSuggestionKind('METHOD_NAME', 11);
+
+  static const CompletionSuggestionKind PARAMETER = const CompletionSuggestionKind('PARAMETER', 12);
+
+  static const CompletionSuggestionKind SETTER = const CompletionSuggestionKind('SETTER', 13);
+
+  static const CompletionSuggestionKind VARIABLE = const CompletionSuggestionKind('VARIABLE', 14);
+
+  static const CompletionSuggestionKind TYPE_PARAMETER = const CompletionSuggestionKind('TYPE_PARAMETER', 15);
+
+  static const CompletionSuggestionKind ARGUMENT_LIST = const CompletionSuggestionKind('ARGUMENT_LIST', 16);
+
+  static const CompletionSuggestionKind OPTIONAL_ARGUMENT = const CompletionSuggestionKind('OPTIONAL_ARGUMENT', 17);
+
+  static const CompletionSuggestionKind NAMED_ARGUMENT = const CompletionSuggestionKind('NAMED_ARGUMENT', 18);
+
+  static const List<CompletionSuggestionKind> values = const [
+      NONE,
+      CLASS,
+      CLASS_ALIAS,
+      CONSTRUCTOR,
+      FIELD,
+      FUNCTION,
+      FUNCTION_ALIAS,
+      GETTER,
+      IMPORT,
+      LIBRARY_PREFIX,
+      METHOD,
+      METHOD_NAME,
+      PARAMETER,
+      SETTER,
+      VARIABLE,
+      TYPE_PARAMETER,
+      ARGUMENT_LIST,
+      OPTIONAL_ARGUMENT,
+      NAMED_ARGUMENT];
+
+  const CompletionSuggestionKind(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * The interface `Consumer` is a marker interface for all consumers interfaces.
+ */
+abstract class Consumer {
+}
 
 /**
  * The interface `Element` defines the behavior of objects that represent an information for
@@ -22,6 +169,13 @@
   static final List<Element> EMPTY_ARRAY = new List<Element>(0);
 
   /**
+   * Return the id of the context this element is created in.
+   *
+   * @return the id of the context
+   */
+  String get contextId;
+
+  /**
    * Return the id of the element, may be `null` if there is no resolution information
    * associated with this element.
    *
@@ -315,20 +469,6 @@
 }
 
 /**
- * The interface `MinorRefactoringsConsumer` defines the behavior of objects that consume
- * minor refactorings [CorrectionProposal]s.
- */
-abstract class MinorRefactoringsConsumer {
-  /**
-   * A set [CorrectionProposal]s has been computed.
-   *
-   * @param proposals an array of computed [CorrectionProposal]s
-   * @param isLastResult is `true` if this is the last set of results
-   */
-  void computedProposals(List<CorrectionProposal> proposals, bool isLastResult);
-}
-
-/**
  * The interface `NavigationRegion` defines the behavior of objects representing a list of
  * elements with which a source region is associated.
  */
@@ -450,6 +590,13 @@
    * @return the source containing the result
    */
   Source get source;
+
+  /**
+   * Return `true` is this search result is a potential reference to a class member.
+   *
+   * @return `true` is this search result is a potential reference to a class member
+   */
+  bool get isPotential;
 }
 
 /**
@@ -457,84 +604,126 @@
  */
 class SearchResultKind extends Enum<SearchResultKind> {
   /**
+   * A declaration of a class.
+   */
+  static const SearchResultKind CLASS_DECLARATION = const SearchResultKind('CLASS_DECLARATION', 0);
+
+  /**
+   * A declaration of a class member.
+   */
+  static const SearchResultKind CLASS_MEMBER_DECLARATION = const SearchResultKind('CLASS_MEMBER_DECLARATION', 1);
+
+  /**
    * A reference to a constructor.
    */
-  static const SearchResultKind CONSTRUCTOR_REFERENCE = const SearchResultKind('CONSTRUCTOR_REFERENCE', 0);
+  static const SearchResultKind CONSTRUCTOR_REFERENCE = const SearchResultKind('CONSTRUCTOR_REFERENCE', 2);
 
   /**
    * A reference to a field (from field formal parameter).
    */
-  static const SearchResultKind FIELD_REFERENCE = const SearchResultKind('FIELD_REFERENCE', 1);
+  static const SearchResultKind FIELD_REFERENCE = const SearchResultKind('FIELD_REFERENCE', 3);
 
   /**
    * A reference to a field in which it is read.
    */
-  static const SearchResultKind FIELD_READ = const SearchResultKind('FIELD_READ', 2);
+  static const SearchResultKind FIELD_READ = const SearchResultKind('FIELD_READ', 4);
+
+  /**
+   * A reference to a field in which it is read and written.
+   */
+  static const SearchResultKind FIELD_READ_WRITE = const SearchResultKind('FIELD_READ_WRITE', 5);
 
   /**
    * A reference to a field in which it is written.
    */
-  static const SearchResultKind FIELD_WRITE = const SearchResultKind('FIELD_WRITE', 3);
+  static const SearchResultKind FIELD_WRITE = const SearchResultKind('FIELD_WRITE', 6);
+
+  /**
+   * A declaration of a function.
+   */
+  static const SearchResultKind FUNCTION_DECLARATION = const SearchResultKind('FUNCTION_DECLARATION', 7);
 
   /**
    * A reference to a function in which it is invoked.
    */
-  static const SearchResultKind FUNCTION_INVOCATION = const SearchResultKind('FUNCTION_INVOCATION', 4);
+  static const SearchResultKind FUNCTION_INVOCATION = const SearchResultKind('FUNCTION_INVOCATION', 8);
 
   /**
    * A reference to a function in which it is referenced.
    */
-  static const SearchResultKind FUNCTION_REFERENCE = const SearchResultKind('FUNCTION_REFERENCE', 5);
+  static const SearchResultKind FUNCTION_REFERENCE = const SearchResultKind('FUNCTION_REFERENCE', 9);
+
+  /**
+   * A declaration of a function type.
+   */
+  static const SearchResultKind FUNCTION_TYPE_DECLARATION = const SearchResultKind('FUNCTION_TYPE_DECLARATION', 10);
 
   /**
    * A reference to a method in which it is invoked.
    */
-  static const SearchResultKind METHOD_INVOCATION = const SearchResultKind('METHOD_INVOCATION', 6);
+  static const SearchResultKind METHOD_INVOCATION = const SearchResultKind('METHOD_INVOCATION', 11);
 
   /**
    * A reference to a method in which it is referenced.
    */
-  static const SearchResultKind METHOD_REFERENCE = const SearchResultKind('METHOD_REFERENCE', 7);
+  static const SearchResultKind METHOD_REFERENCE = const SearchResultKind('METHOD_REFERENCE', 12);
+
+  /**
+   * A reference to a name, resolved.
+   */
+  static const SearchResultKind NAME_REFERENCE_RESOLVED = const SearchResultKind('NAME_REFERENCE_RESOLVED', 13);
+
+  /**
+   * A reference to a name, unresolved.
+   */
+  static const SearchResultKind NAME_REFERENCE_UNRESOLVED = const SearchResultKind('NAME_REFERENCE_UNRESOLVED', 14);
 
   /**
    * A reference to a property accessor.
    */
-  static const SearchResultKind PROPERTY_ACCESSOR_REFERENCE = const SearchResultKind('PROPERTY_ACCESSOR_REFERENCE', 8);
+  static const SearchResultKind PROPERTY_ACCESSOR_REFERENCE = const SearchResultKind('PROPERTY_ACCESSOR_REFERENCE', 15);
 
   /**
    * A reference to a type.
    */
-  static const SearchResultKind TYPE_REFERENCE = const SearchResultKind('TYPE_REFERENCE', 9);
+  static const SearchResultKind TYPE_REFERENCE = const SearchResultKind('TYPE_REFERENCE', 16);
 
   /**
    * A declaration of a variable.
    */
-  static const SearchResultKind VARIABLE_DECLARATION = const SearchResultKind('VARIABLE_DECLARATION', 10);
+  static const SearchResultKind VARIABLE_DECLARATION = const SearchResultKind('VARIABLE_DECLARATION', 17);
 
   /**
    * A reference to a variable in which it is read.
    */
-  static const SearchResultKind VARIABLE_READ = const SearchResultKind('VARIABLE_READ', 11);
+  static const SearchResultKind VARIABLE_READ = const SearchResultKind('VARIABLE_READ', 18);
 
   /**
    * A reference to a variable in which it is both read and written.
    */
-  static const SearchResultKind VARIABLE_READ_WRITE = const SearchResultKind('VARIABLE_READ_WRITE', 12);
+  static const SearchResultKind VARIABLE_READ_WRITE = const SearchResultKind('VARIABLE_READ_WRITE', 19);
 
   /**
    * A reference to a variable in which it is written.
    */
-  static const SearchResultKind VARIABLE_WRITE = const SearchResultKind('VARIABLE_WRITE', 13);
+  static const SearchResultKind VARIABLE_WRITE = const SearchResultKind('VARIABLE_WRITE', 20);
 
   static const List<SearchResultKind> values = const [
+      CLASS_DECLARATION,
+      CLASS_MEMBER_DECLARATION,
       CONSTRUCTOR_REFERENCE,
       FIELD_REFERENCE,
       FIELD_READ,
+      FIELD_READ_WRITE,
       FIELD_WRITE,
+      FUNCTION_DECLARATION,
       FUNCTION_INVOCATION,
       FUNCTION_REFERENCE,
+      FUNCTION_TYPE_DECLARATION,
       METHOD_INVOCATION,
       METHOD_REFERENCE,
+      NAME_REFERENCE_RESOLVED,
+      NAME_REFERENCE_UNRESOLVED,
       PROPERTY_ACCESSOR_REFERENCE,
       TYPE_REFERENCE,
       VARIABLE_DECLARATION,
@@ -549,17 +738,15 @@
  * The interface `SearchReferencesConsumer` defines the behavior of objects that consume
  * [SearchResult]s.
  */
-abstract class SearchResultsConsumer {
+abstract class SearchResultsConsumer implements Consumer {
   /**
    * [SearchResult]s have been computed.
    *
    * @param contextId the identifier of the context to search within
-   * @param source the [Source] with element
-   * @param offset the offset within the `source`
    * @param searchResults an array of [SearchResult]s computed so far
    * @param isLastResult is `true` if this is the last set of results
    */
-  void computedReferences(String contextId, Source source, int offset, List<SearchResult> searchResults, bool isLastResult);
+  void computed(List<SearchResult> searchResults, bool isLastResult);
 }
 
 /**
@@ -637,6 +824,67 @@
 }
 
 /**
+ * The interface `TypeHierarchyItem` defines the behavior of objects representing an item in a
+ * type hierarchy.
+ */
+abstract class TypeHierarchyItem {
+  /**
+   * An empty array of hierarchy items.
+   */
+  static final List<TypeHierarchyItem> EMPTY_ARRAY = new List<TypeHierarchyItem>(0);
+
+  /**
+   * Return the class element associated with this item. Not `null`.
+   *
+   * @return the class element associated with this item
+   */
+  Element get classElement;
+
+  /**
+   * Return the type that is extended by this type, `null` if this item is `Object`.
+   *
+   * @return the type that is extended by this type
+   */
+  TypeHierarchyItem get extendedType;
+
+  /**
+   * Return the types that are implemented by this type, `null` if not a super item.
+   *
+   * @return the types that are implemented by this type
+   */
+  List<TypeHierarchyItem> get implementedTypes;
+
+  /**
+   * Return the member element associated with this item. May be `null` if this type does not
+   * define the member which hierarchy is requested.
+   *
+   * @return the member element associated with this item
+   */
+  Element get memberElement;
+
+  /**
+   * Return the types that are mixed into this type, `null` if not a super item.
+   *
+   * @return the types that are mixed into this type
+   */
+  List<TypeHierarchyItem> get mixedTypes;
+
+  /**
+   * Return the display name of this item.
+   *
+   * @return the display name of this item
+   */
+  String get name;
+
+  /**
+   * Return the subtypes of this type, may be empty, but not `null`.
+   *
+   * @return the subtypes of this type
+   */
+  List<TypeHierarchyItem> get subTypes;
+}
+
+/**
  * An implementation of [SourceSet] for some [SourceSetKind].
  */
 class _ImplicitSourceSet implements SourceSet {
diff --git a/pkg/analysis_server/lib/src/get_handler.dart b/pkg/analysis_server/lib/src/get_handler.dart
index ca938cd..ce8ad00 100644
--- a/pkg/analysis_server/lib/src/get_handler.dart
+++ b/pkg/analysis_server/lib/src/get_handler.dart
@@ -66,15 +66,16 @@
           response,
           ['Context', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
           true);
+      // TODO(scheglov) replace with using folder based contexts
       _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
-        AnalysisContextStatistics statistics =
+        AnalysisContentStatistics statistics =
             (context as AnalysisContextImpl).statistics;
         int errorCount = 0;
         int flushedCount = 0;
         int inProcessCount = 0;
         int invalidCount = 0;
         int validCount = 0;
-        statistics.cacheRows.forEach((AnalysisContextStatistics_CacheRow row) {
+        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
           errorCount += row.errorCount;
           flushedCount += row.flushedCount;
           inProcessCount += row.inProcessCount;
@@ -92,13 +93,13 @@
       response.write('</table>');
       _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
         response.write('<h2><a name="context_$key">Analysis Context: $key</a></h2>');
-        AnalysisContextStatistics statistics = (context as AnalysisContextImpl).statistics;
+        AnalysisContentStatistics statistics = (context as AnalysisContextImpl).statistics;
         response.write('<table>');
         _writeRow(
             response,
             ['Item', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
             true);
-        statistics.cacheRows.forEach((AnalysisContextStatistics_CacheRow row) {
+        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
           _writeRow(
               response,
               [row.name,
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index 21d8b08..07f4008 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -298,7 +298,7 @@
   /**
    * Determine if the datum is a list of strings.
    */
-  bool isStringList() {
+  bool get isStringList {
     if (datum is! List) {
       return false;
     }
@@ -314,7 +314,7 @@
    * Validate that the datum is a list of strings, and return it.
    */
   List<String> asStringList() {
-    if (!isStringList()) {
+    if (!isStringList) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a list of strings"));
     }
@@ -343,7 +343,7 @@
    * Note: we can safely assume that the keys are all strings, since JSON maps
    * cannot have any other key type.
    */
-  bool isStringMap() {
+  bool get isStringMap {
     if (datum is! Map) {
       return false;
     }
@@ -359,7 +359,7 @@
    * Validate that the datum is a map from strings to strings, and return it.
    */
   Map<String, String> asStringMap() {
-    if (!isStringMap()) {
+    if (!isStringMap) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a string map"));
     }
@@ -462,6 +462,9 @@
   Response.contextAlreadyExists(Request request)
     : this(request.id, new RequestError(-8, 'Context already exists'));
 
+  Response.unsupportedFeature(String requestId, String message)
+    : this(requestId, new RequestError(-9, message));
+
   /**
    * Initialize a newly created instance based upon the given JSON data
    */
@@ -690,6 +693,9 @@
     }
     return jsonObject;
   }
+
+  @override
+  String toString() => toJson().toString();
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/resource.dart b/pkg/analysis_server/lib/src/resource.dart
index 2db8d61..b8b6c3c 100644
--- a/pkg/analysis_server/lib/src/resource.dart
+++ b/pkg/analysis_server/lib/src/resource.dart
@@ -4,12 +4,14 @@
 
 library resource;
 
+import 'dart:async';
 import 'dart:io' as io;
 
 import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
 import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:path/path.dart';
+import 'package:watcher/watcher.dart';
 
 
 /**
@@ -38,6 +40,12 @@
    * in this folder, in no particular order.
    */
   List<Resource> getChildren();
+
+  /**
+   * Watch for changes to the files inside this folder (and in any nested
+   * folders, including folders reachable via links).
+   */
+  Stream<WatchEvent> get changes;
 }
 
 
@@ -51,10 +59,9 @@
   bool get exists;
 
   /**
-   * Return the full (long) version of the name that can be displayed to the
-   * user to denote this resource.
+   * Return the full path to this resource.
    */
-  String get fullName;
+  String get path;
 
   /**
    * Return a short version of the name that can be displayed to the user to
@@ -81,9 +88,9 @@
  */
 abstract class _MemoryResource implements Resource {
   final MemoryResourceProvider _provider;
-  final String _path;
+  final String path;
 
-  _MemoryResource(this._provider, this._path);
+  _MemoryResource(this._provider, this.path);
 
   @override
   bool operator ==(other) {
@@ -91,19 +98,16 @@
   }
 
   @override
-  bool get exists => _provider._pathToResource.containsKey(_path);
+  bool get exists => _provider._pathToResource.containsKey(path);
 
   @override
-  String get fullName => _path;
+  get hashCode => path.hashCode;
 
   @override
-  get hashCode => _path.hashCode;
+  String get shortName => posix.basename(path);
 
   @override
-  String get shortName => basename(_path);
-
-  @override
-  String toString() => fullName;
+  String toString() => path;
 }
 
 
@@ -120,14 +124,14 @@
   }
 
   String get _content {
-    String content = _provider._pathToContent[_path];
+    String content = _provider._pathToContent[path];
     if (content == null) {
-      throw new MemoryResourceException(_path, "File '$_path' does not exist");
+      throw new MemoryResourceException(path, "File '$path' does not exist");
     }
     return content;
   }
 
-  int get _timestamp => _provider._pathToTimestamp[_path];
+  int get _timestamp => _provider._pathToTimestamp[path];
 }
 
 
@@ -158,20 +162,31 @@
   _MemoryFileSource(this._file, this.uriKind);
 
   @override
+  bool operator ==(other) {
+    if (other is _MemoryFileSource) {
+      return other._file == _file;
+    }
+    return false;
+  }
+
+  @override
   TimestampedData<String> get contents {
     return new TimestampedData<String>(modificationStamp, _file._content);
   }
 
   @override
   String get encoding {
-    return '${new String.fromCharCode(uriKind.encoding)}${_file.fullName}';
+    return '${new String.fromCharCode(uriKind.encoding)}${_file.path}';
   }
 
   @override
   bool exists() => _file.exists;
 
   @override
-  String get fullName => _file.fullName;
+  String get fullName => _file.path;
+
+  @override
+  int get hashCode => _file.hashCode;
 
   @override
   bool get isInSystemLibrary => false;
@@ -181,10 +196,10 @@
 
   @override
   Source resolveRelative(Uri relativeUri) {
-    String relativePath = fromUri(relativeUri);
-    String folderPath = dirname(_file._path);
-    String path = join(folderPath, relativePath);
-    path = normalize(path);
+    String relativePath = posix.fromUri(relativeUri);
+    String folderPath = posix.dirname(_file.path);
+    String path = posix.join(folderPath, relativePath);
+    path = posix.normalize(path);
     _MemoryFile file = new _MemoryFile(_file._provider, path);
     return new _MemoryFileSource(file, uriKind);
   }
@@ -202,9 +217,9 @@
       super(provider, path);
   @override
   Resource getChild(String relPath) {
-    relPath = normalize(relPath);
-    String childPath = join(_path, relPath);
-    childPath = normalize(childPath);
+    relPath = posix.normalize(relPath);
+    String childPath = posix.join(path, relPath);
+    childPath = posix.normalize(childPath);
     _MemoryResource resource = _provider._pathToResource[childPath];
     if (resource == null) {
       resource = new _MemoryFile(_provider, childPath);
@@ -215,13 +230,28 @@
   @override
   List<Resource> getChildren() {
     List<Resource> children = <Resource>[];
-    _provider._pathToResource.forEach((path, resource) {
-      if (dirname(path) == _path) {
+    _provider._pathToResource.forEach((resourcePath, resource) {
+      if (posix.dirname(resourcePath) == path) {
         children.add(resource);
       }
     });
     return children;
   }
+
+  @override
+  Stream<WatchEvent> get changes {
+    if (_provider._pathToWatcher.containsKey(path)) {
+      // Two clients watching the same path is not yet supported.
+      // TODO(paulberry): add support for this if needed.
+      throw new StateError('Path "$path" is already being watched for changes');
+    }
+    StreamController<WatchEvent> streamController = new StreamController<WatchEvent>();
+    _provider._pathToWatcher[path] = streamController;
+    streamController.done.then((_) {
+      _provider._pathToWatcher.remove(path);
+    });
+    return streamController.stream;
+  }
 }
 
 
@@ -233,11 +263,13 @@
   final Map<String, _MemoryResource> _pathToResource = <String, _MemoryResource>{};
   final Map<String, String> _pathToContent = <String, String>{};
   final Map<String, int> _pathToTimestamp = <String, int>{};
+  final Map<String, StreamController<WatchEvent>> _pathToWatcher =
+      <String, StreamController<WatchEvent>>{};
   int nextStamp = 0;
 
   @override
   Resource getResource(String path) {
-    path = normalize(path);
+    path = posix.normalize(path);
     Resource resource = _pathToResource[path];
     if (resource == null) {
       resource = new _MemoryFile(this, path);
@@ -246,10 +278,7 @@
   }
 
   Folder newFolder(String path) {
-    path = normalize(path);
-    if (path.isEmpty) {
-      throw new ArgumentError('Empty paths are not supported');
-    }
+    path = posix.normalize(path);
     if (!path.startsWith('/')) {
       throw new ArgumentError("Path must start with '/'");
     }
@@ -278,14 +307,46 @@
   }
 
   File newFile(String path, String content) {
-    path = normalize(path);
-    newFolder(dirname(path));
+    path = posix.normalize(path);
+    newFolder(posix.dirname(path));
     _MemoryFile file = new _MemoryFile(this, path);
     _pathToResource[path] = file;
     _pathToContent[path] = content;
     _pathToTimestamp[path] = nextStamp++;
+    _notifyWatchers(path, ChangeType.ADD);
     return file;
   }
+
+  void _notifyWatchers(String path, ChangeType changeType) {
+    _pathToWatcher.forEach((String watcherPath, StreamController<WatchEvent> streamController) {
+      if (posix.isWithin(watcherPath, path)) {
+        streamController.add(new WatchEvent(changeType, path));
+      }
+    });
+  }
+
+  void modifyFile(String path, String content) {
+    _checkFileAtPath(path);
+    _pathToContent[path] = content;
+    _pathToTimestamp[path] = nextStamp++;
+    _notifyWatchers(path, ChangeType.MODIFY);
+  }
+
+  void _checkFileAtPath(String path) {
+    _MemoryResource resource = _pathToResource[path];
+    if (resource is! _MemoryFile) {
+      throw new ArgumentError(
+          'File expected at "$path" but ${resource.runtimeType} found');
+    }
+  }
+
+  void deleteFile(String path) {
+    _checkFileAtPath(path);
+    _pathToResource.remove(path);
+    _pathToContent.remove(path);
+    _pathToTimestamp.remove(path);
+    _notifyWatchers(path, ChangeType.REMOVE);
+  }
 }
 
 
@@ -332,6 +393,9 @@
     }
     return children;
   }
+
+  @override
+  Stream<WatchEvent> get changes => new DirectoryWatcher(_entry.path).events;
 }
 
 
@@ -347,16 +411,16 @@
   bool get exists => _entry.existsSync();
 
   @override
-  String get fullName => _entry.absolute.path;
+  String get path => _entry.absolute.path;
 
   @override
   get hashCode => _entry.hashCode;
 
   @override
-  String get shortName => basename(fullName);
+  String get shortName => basename(path);
 
   @override
-  String toString() => fullName;
+  String toString() => path;
 }
 
 
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 31d7e1b..59b5a9b 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/domain_context.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart';
 
 /**
  * Instances of the class [SocketServer] implement the common parts of
@@ -37,7 +38,9 @@
       });
       return;
     }
-    analysisServer = new AnalysisServer(serverChannel);
+    analysisServer = new AnalysisServer(
+        serverChannel,
+        PhysicalResourceProvider.INSTANCE);
     _initializeHandlers(analysisServer);
   }
 
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 82e0c01..7b68188 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analysis_server
-version: 0.0.2
+version: 0.0.3
 author: Dart Team <misc@dartlang.org>
 description: An HTTP server that performs analysis of Dart code via web sockets.
 homepage: http://www.dartlang.org
@@ -11,6 +11,7 @@
   args: any
   logging: any
   path: any
+  watcher: any
 dev_dependencies:
   mock: '>=0.10.0 <0.11.0'
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index d730201..dd4807b 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -7,11 +7,11 @@
 import 'dart:async';
 
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart';
 import 'package:mock/mock.dart';
 import 'package:unittest/unittest.dart';
 
@@ -24,9 +24,9 @@
         AnalysisServerTest.addContextToWorkQueue_twice);
     test('addContextToWorkQueue_whenNotRunning',
         AnalysisServerTest.addContextToWorkQueue_whenNotRunning);
-    test('addContextToWorkQueue_whenRunning',
-        AnalysisServerTest.addContextToWorkQueue_whenRunning);
     // TODO(scheglov) remove or move to the 'analysis' domain
+//    test('addContextToWorkQueue_whenRunning',
+//        AnalysisServerTest.addContextToWorkQueue_whenRunning);
 //    test('createContext', AnalysisServerTest.createContext);
     test('echo', AnalysisServerTest.echo);
     test('errorToJson_formattingApplied',
@@ -49,7 +49,7 @@
 
   static void setUp() {
     channel = new MockServerChannel();
-    server = new AnalysisServer(channel);
+    server = new AnalysisServer(channel, PhysicalResourceProvider.INSTANCE);
     logger = new MockAnalysisLogger();
     AnalysisEngine.instance.logger = logger;
   }
@@ -63,44 +63,65 @@
     return pumpEventQueue();
   }
 
-  static Future addContextToWorkQueue_whenRunning() {
-    MockAnalysisContext context = new MockAnalysisContext();
-    server.addContextToWorkQueue(context);
-    server.contextIdMap[context] = 'context-27';
-    MockSource source = new MockSource();
-    source.when(callsTo('get encoding')).alwaysReturn('foo.dart');
-    ChangeNoticeImpl changeNoticeImpl = new ChangeNoticeImpl(source);
-    LineInfo lineInfo = new LineInfo([0]);
-    AnalysisError analysisError = new AnalysisError.con1(source,
-        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, ['Foo']);
-    changeNoticeImpl.setErrors([analysisError], lineInfo);
-    context.when(callsTo('performAnalysisTask')).thenReturn(
-        new AnalysisResult([changeNoticeImpl], 0, 'myClass', 0));
-    context.when(callsTo('performAnalysisTask')).thenReturn(
-        new AnalysisResult(null, 0, null, 0));
-    return pumpEventQueue().then((_) {
-      context.getLogs(callsTo('performAnalysisTask')).verify(happenedExactly(2));
-      var notifications = channel.notificationsReceived;
-      expect(notifications, hasLength(2));
-      expect(notifications[0].event, equals('server.connected'));
-      expect(notifications[1].event, equals('context.errors'));
-      expect(notifications[1].params['source'], equals('foo.dart'));
-      expect(notifications[1].params['contextId'], equals('context-27'));
-      List<AnalysisError> errors = notifications[1].params['errors'];
-      expect(errors, hasLength(1));
-      expect(errors[0], equals(AnalysisServer.errorToJson(analysisError)));
-    });
-  }
+  // TODO(scheglov) remove after implementing "setAnalysisRoots" API
+//  static Future addContextToWorkQueue_whenRunning() {
+//    MockAnalysisContext context = new MockAnalysisContext();
+//    server.addContextToWorkQueue(context);
+//    server.contextIdMap[context] = 'context-27';
+//    MockSource source = new MockSource();
+//    source.when(callsTo('get encoding')).alwaysReturn('foo.dart');
+//    ChangeNoticeImpl changeNoticeImpl = new ChangeNoticeImpl(source);
+//    LineInfo lineInfo = new LineInfo([0]);
+//    AnalysisError analysisError = new AnalysisError.con1(source,
+//        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, ['Foo']);
+//    changeNoticeImpl.setErrors([analysisError], lineInfo);
+//    context.when(callsTo('performAnalysisTask')).thenReturn(
+//        new AnalysisResult([changeNoticeImpl], 0, 'myClass', 0));
+//    context.when(callsTo('performAnalysisTask')).thenReturn(
+//        new AnalysisResult(null, 0, null, 0));
+//    return pumpEventQueue().then((_) {
+//      context.getLogs(callsTo('performAnalysisTask')).verify(happenedExactly(2));
+//      List<Notification> notifications = channel.notificationsReceived;
+//      expect(notifications, hasLength(4));
+//
+//      expect(notifications[0].event, equals('server.connected'));
+//
+//      assertStatusNotification(notifications[1], true);
+//
+//      expect(notifications[2].event, equals('context.errors'));
+//      expect(notifications[2].params['source'], equals('foo.dart'));
+//      expect(notifications[2].params['contextId'], equals('context-27'));
+//      List<AnalysisError> errors = notifications[2].params['errors'];
+//      expect(errors, hasLength(1));
+//      expect(errors[0], equals(AnalysisServer.errorToJson(analysisError)));
+//
+//      assertStatusNotification(notifications[3], false);
+//    });
+//  }
+//
+//  static void assertStatusNotification(Notification notification, bool expectAnalyzing) {
+//    expect(notification.event, equals('server.status'));
+//    Map<String, Object> analysis = notification.params['analysis'];
+//    expect(analysis['analyzing'], expectAnalyzing);
+//    expect(analysis.containsKey('analysisTarget'), expectAnalyzing);
+//    if (expectAnalyzing) {
+//      var analysisTarget = analysis['analysisTarget'];
+//      expect((analysisTarget is String), isTrue);
+//      expect(analysisTarget.length > 0, isTrue);
+//    }
+//  }
 
   static Future addContextToWorkQueue_twice() {
-    // The context should only be asked to perform its analysis task once.
-    MockAnalysisContext context = new MockAnalysisContext();
-    server.addContextToWorkQueue(context);
-    server.addContextToWorkQueue(context);
-    context.when(callsTo('performAnalysisTask')).thenReturn(
-        new AnalysisResult(null, 0, null, 0));
-    return pumpEventQueue().then((_) =>
-        context.getLogs(callsTo('performAnalysisTask')).verify(happenedExactly(1)));
+    // TODO(scheglov) remove after implementing "setAnalysisRoots" API
+    return new Future.value();
+//    // The context should only be asked to perform its analysis task once.
+//    MockAnalysisContext context = new MockAnalysisContext();
+//    server.addContextToWorkQueue(context);
+//    server.addContextToWorkQueue(context);
+//    context.when(callsTo('performAnalysisTask')).thenReturn(
+//        new AnalysisResult(null, 0, null, 0));
+//    return pumpEventQueue().then((_) =>
+//        context.getLogs(callsTo('performAnalysisTask')).verify(happenedExactly(1)));
   }
 
   // TODO(scheglov) remove or move to the 'analysis' domain
@@ -140,15 +161,15 @@
 
   static void errorToJson_noCorrection() {
     MockSource source = new MockSource();
-    source.when(callsTo('get encoding')).alwaysReturn('foo.dart');
+    source.when(callsTo('get fullName')).alwaysReturn('foo.dart');
     CompileTimeErrorCode errorCode =
         CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER;
     AnalysisError analysisError =
         new AnalysisError.con2(source, 10, 5, errorCode, ['Foo']);
     Map<String, Object> json = AnalysisServer.errorToJson(analysisError);
     expect(json, hasLength(5));
-    expect(json['source'], equals('foo.dart'));
-    expect(json['errorCode'], equals(errorCode.ordinal));
+    expect(json['file'], equals('foo.dart'));
+    expect(json['errorCode'], 'CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER');
     expect(json['offset'], equals(analysisError.offset));
     expect(json['length'], equals(analysisError.length));
     expect(json['message'], equals(errorCode.message.replaceAll('%s', 'Foo')));
diff --git a/pkg/analysis_server/test/context_directory_manager_test.dart b/pkg/analysis_server/test/context_directory_manager_test.dart
new file mode 100644
index 0000000..f9d359e
--- /dev/null
+++ b/pkg/analysis_server/test/context_directory_manager_test.dart
@@ -0,0 +1,144 @@
+// 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.context.directory.manager;
+
+import 'mocks.dart';
+import 'package:analysis_server/src/context_directory_manager.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+class TestContextDirectoryManager extends ContextDirectoryManager {
+  TestContextDirectoryManager(MemoryResourceProvider provider) : super(provider);
+
+  final Set<String> currentContextPaths = new Set<String>();
+  final Map<String, String> currentContextPubspecPaths = <String, String>{};
+  final Map<String, Set<String>> currentContextFilePaths = <String, Set<String>>{};
+
+  @override
+  void addContext(Folder folder, File pubspecFile) {
+    currentContextPaths.add(folder.path);
+    currentContextPubspecPaths[folder.path] = pubspecFile != null ? pubspecFile.path : null;
+    currentContextFilePaths[folder.path] = new Set<String>();
+  }
+
+  @override
+  void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
+    Set<String> filePaths = currentContextFilePaths[contextFolder.path];
+    for (Source source in changeSet.addedSources) {
+      expect(filePaths, isNot(contains(source.fullName)));
+      filePaths.add(source.fullName);
+    }
+    for (Source source in changeSet.removedSources) {
+      expect(filePaths, contains(source.fullName));
+      filePaths.remove(source.fullName);
+    }
+    // TODO(paulberry): handle source.changedSources.
+  }
+}
+
+main() {
+  groupSep = ' | ';
+
+  group('ContextDirectoryManager', () {
+    TestContextDirectoryManager manager;
+    MemoryResourceProvider provider;
+
+    setUp(() {
+      provider = new MemoryResourceProvider();
+      manager = new TestContextDirectoryManager(provider);
+    });
+
+    test('add folder with pubspec', () {
+      String projPath = '/my/proj';
+      String pubspecPath = posix.join(projPath, 'pubspec.yaml');
+      provider.newFolder(projPath);
+      provider.newFile(pubspecPath, 'pubspec');
+      manager.setRoots(<String>[projPath], <String>[]);
+      expect(manager.currentContextPaths, hasLength(1));
+      expect(manager.currentContextPaths, contains(projPath));
+      expect(manager.currentContextPubspecPaths[projPath], equals(pubspecPath));
+      expect(manager.currentContextFilePaths[projPath], hasLength(0));
+    });
+
+    test('add folder without pubspec', () {
+      String projPath = '/my/proj';
+      provider.newFolder(projPath);
+      manager.setRoots(<String>[projPath], <String>[]);
+      expect(manager.currentContextPaths, hasLength(1));
+      expect(manager.currentContextPaths, contains(projPath));
+      expect(manager.currentContextPubspecPaths[projPath], isNull);
+      expect(manager.currentContextFilePaths[projPath], hasLength(0));
+    });
+
+    test('add folder with dart file', () {
+      String projPath = '/my/proj';
+      provider.newFolder(projPath);
+      String filePath = posix.join(projPath, 'foo.dart');
+      provider.newFile(filePath, 'contents');
+      manager.setRoots(<String>[projPath], <String>[]);
+      var filePaths = manager.currentContextFilePaths[projPath];
+      expect(filePaths, hasLength(1));
+      expect(filePaths, contains(filePath));
+    });
+
+    test('add folder with dart file in subdir', () {
+      String projPath = '/my/proj';
+      provider.newFolder(projPath);
+      String filePath = posix.join(projPath, 'foo', 'bar.dart');
+      provider.newFile(filePath, 'contents');
+      manager.setRoots(<String>[projPath], <String>[]);
+      var filePaths = manager.currentContextFilePaths[projPath];
+      expect(filePaths, hasLength(1));
+      expect(filePaths, contains(filePath));
+    });
+
+    group('detect context modifications', () {
+      String projPath;
+
+      setUp(() {
+        projPath = '/my/proj';
+        provider.newFolder(projPath);
+      });
+
+      test('Add file', () {
+        manager.setRoots(<String>[projPath], <String>[]);
+        Set<String> filePaths = manager.currentContextFilePaths[projPath];
+        expect(filePaths, hasLength(0));
+        String filePath = posix.join(projPath, 'foo.dart');
+        provider.newFile(filePath, 'contents');
+        return pumpEventQueue().then((_) {
+          expect(filePaths, hasLength(1));
+          expect(filePaths, contains(filePath));
+        });
+      });
+
+      test('Add file in subdirectory', () {
+        manager.setRoots(<String>[projPath], <String>[]);
+        Set<String> filePaths = manager.currentContextFilePaths[projPath];
+        expect(filePaths, hasLength(0));
+        String filePath = posix.join(projPath, 'foo', 'bar.dart');
+        provider.newFile(filePath, 'contents');
+        return pumpEventQueue().then((_) {
+          expect(filePaths, hasLength(1));
+          expect(filePaths, contains(filePath));
+        });
+      });
+
+      test('Delete file', () {
+        String filePath = posix.join(projPath, 'foo.dart');
+        provider.newFile(filePath, 'contents');
+        manager.setRoots(<String>[projPath], <String>[]);
+        Set<String> filePaths = manager.currentContextFilePaths[projPath];
+        expect(filePaths, hasLength(1));
+        expect(filePaths, contains(filePath));
+        provider.deleteFile(filePath);
+        return pumpEventQueue().then((_) => expect(filePaths, hasLength(0)));
+      });
+    });
+  });
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 5357050..2a4d8d2 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -4,23 +4,34 @@
 
 library test.domain.analysis;
 
+import 'dart:async';
+
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
 
+
 main() {
+  groupSep = ' | ';
+
+  MockServerChannel serverChannel;
   AnalysisServer server;
   AnalysisDomainHandler handler;
+  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
 
   setUp(() {
-    var serverChannel = new MockServerChannel();
-    server = new AnalysisServer(serverChannel);
+    serverChannel = new MockServerChannel();
+    server = new AnalysisServer(serverChannel, resourceProvider);
     handler = new AnalysisDomainHandler(server);
   });
 
+  group('notification.errors', testNotificationErrors);
+  group('updateContent', testUpdateContent);
+
   group('AnalysisDomainHandler', () {
     test('getFixes', () {
       var request = new Request('0', AnalysisDomainHandler.GET_FIXES_METHOD);
@@ -40,17 +51,40 @@
       expect(response, isNull);
     });
 
-    test('setAnalysisRoots', () {
-      var request = new Request('0', AnalysisDomainHandler.SET_ANALYSIS_ROOTS_METHOD);
-      request.setParameter(
-          AnalysisDomainHandler.INCLUDED_PARAM,
-          ['projectA', 'projectB']);
-      request.setParameter(
-          AnalysisDomainHandler.EXCLUDED_PARAM,
-          ['projectA/subAA', 'projectA/subAB', 'projectB/subBA']);
-      var response = handler.handleRequest(request);
-      // TODO(scheglov) implement
-      expect(response, isNull);
+    group('setAnalysisRoots', () {
+      Request request;
+
+      setUp(() {
+        request = new Request('0', AnalysisDomainHandler.SET_ANALYSIS_ROOTS_METHOD);
+        request.setParameter(AnalysisDomainHandler.INCLUDED_PARAM, []);
+        request.setParameter(AnalysisDomainHandler.EXCLUDED_PARAM, []);
+      });
+
+      test('excluded', () {
+        request.setParameter(AnalysisDomainHandler.EXCLUDED_PARAM, ['foo']);
+        // TODO(scheglov) implement
+        var response = handler.handleRequest(request);
+        expect(response, isResponseFailure('0'));
+      });
+
+      group('included', () {
+        test('new folder', () {
+          resourceProvider.newFolder('/project');
+          resourceProvider.newFile('/project/pubspec.yaml', 'name: project');
+          resourceProvider.newFile('/project/bin/test.dart', 'main() {}');
+          request.setParameter(
+              AnalysisDomainHandler.INCLUDED_PARAM,
+              ['/project']);
+          var response = handler.handleRequest(request);
+          var serverRef = server;
+          expect(response, isResponseSuccess('0'));
+          // verify that unit is resolved eventually
+          return waitForServerTasksFinished(server).then((_) {
+            var unit = serverRef.test_getResolvedCompilationUnit('/project/bin/test.dart');
+            expect(unit, isNotNull);
+          });
+        });
+      });
     });
 
     test('setPriorityFiles', () {
@@ -77,16 +111,6 @@
       expect(response, isNull);
     });
 
-    test('updateContent', () {
-      var request = new Request('0', AnalysisDomainHandler.UPDATE_CONTENT_METHOD);
-//      request.setParameter(
-//          AnalysisDomainHandler.FILES_PARAM,
-//          {'project/test.dart' : null});
-      var response = handler.handleRequest(request);
-      // TODO(scheglov) implement
-      expect(response, isNull);
-    });
-
     test('updateOptions', () {
       var request = new Request('0', AnalysisDomainHandler.UPDATE_OPTIONS_METHOD);
       request.setParameter(
@@ -116,3 +140,223 @@
     });
   });
 }
+
+
+/**
+ * A helper to test 'analysis.*' requests.
+ */
+class AnalysisTestHelper {
+  MockServerChannel serverChannel;
+  MemoryResourceProvider resourceProvider;
+  AnalysisServer server;
+  AnalysisDomainHandler handler;
+
+  Map<String, List<AnalysisError>> filesErrors = {};
+
+  String testFile = '/project/bin/test.dart';
+  String testCode;
+
+  AnalysisTestHelper() {
+    serverChannel = new MockServerChannel();
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(serverChannel, resourceProvider);
+    handler = new AnalysisDomainHandler(server);
+    // listen for notifications
+    Stream<Notification> notificationStream = serverChannel.notificationController.stream;
+    notificationStream.listen((Notification notification) {
+      if (notification.event == AnalysisDomainHandler.ERRORS_NOTIFICATION) {
+        String file = notification.getParameter(AnalysisServer.FILE_PARAM);
+        List<Map<String, Object>> errorMaps = notification.getParameter(AnalysisServer.ERRORS_PARAM);
+        filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList();
+      }
+    });
+  }
+
+  /**
+   * Returns a [Future] that completes when this this helper finished all its
+   * scheduled tasks.
+   */
+  Future waitForTasksFinished() {
+    return waitForServerTasksFinished(server);
+  }
+
+  /**
+   * Returns [AnalysisError]s recorded for the given [file].
+   * May be empty, but not `null`.
+   */
+  List<AnalysisError> getErrors(String file) {
+    List<AnalysisError> errors = filesErrors[file];
+    if (errors != null) {
+      return errors;
+    }
+    return <AnalysisError>[];
+  }
+
+  /**
+   * Returns [AnalysisError]s recorded for the [testFile].
+   * May be empty, but not `null`.
+   */
+  List<AnalysisError> getTestErrors() {
+    return getErrors(testFile);
+  }
+
+  /**
+   * Creates a project with a single Dart file `/project/bin/test.dart` with
+   * the given [code].
+   */
+  void createSingleFileProject(code) {
+    this.testCode = _getCodeString(code);
+    resourceProvider.newFolder('/project');
+    resourceProvider.newFile('/project/pubspec.yaml', 'name: project');
+    resourceProvider.newFile(testFile, testCode);
+    Request request = new Request('0', AnalysisDomainHandler.SET_ANALYSIS_ROOTS_METHOD);
+    request.setParameter(AnalysisDomainHandler.INCLUDED_PARAM, ['/project']);
+    request.setParameter(AnalysisDomainHandler.EXCLUDED_PARAM, []);
+    handleSuccessfulRequest(request);
+  }
+
+  /**
+   * Validates that the given [request] is handled successfully.
+   */
+  void handleSuccessfulRequest(Request request) {
+    Response response = handler.handleRequest(request);
+    expect(response, isResponseSuccess('0'));
+  }
+
+  /**
+   * Stops the associated server.
+   */
+  void stopServer() {
+    server.done();
+  }
+
+  static String _getCodeString(code) {
+    if (code is List<String>) {
+      code = code.join('\n');
+    }
+    return code as String;
+  }
+}
+
+
+testNotificationErrors() {
+  AnalysisTestHelper helper;
+
+  setUp(() {
+    helper = new AnalysisTestHelper();
+  });
+
+  test('ParserErrorCode', () {
+    helper.createSingleFileProject('library lib');
+    return helper.waitForTasksFinished().then((_) {
+      List<AnalysisError> errors = helper.getTestErrors();
+      expect(errors, hasLength(1));
+      AnalysisError error = errors[0];
+      expect(error.file, '/project/bin/test.dart');
+      expect(error.errorCode, 'ParserErrorCode.EXPECTED_TOKEN');
+      expect(error.offset, isPositive);
+      expect(error.length, isNonNegative);
+      expect(error.message, isNotNull);
+    });
+  });
+
+  test('StaticWarningCode', () {
+    helper.createSingleFileProject([
+      'main() {',
+      '  print(unknown);',
+      '}']);
+    return helper.waitForTasksFinished().then((_) {
+      List<AnalysisError> errors = helper.getTestErrors();
+      expect(errors, hasLength(1));
+      AnalysisError error = errors[0];
+      expect(error.errorCode, 'StaticWarningCode.UNDEFINED_IDENTIFIER');
+    });
+  });
+}
+
+
+testUpdateContent() {
+  test('full content', () {
+    AnalysisTestHelper helper = new AnalysisTestHelper();
+    helper.createSingleFileProject('// empty');
+    return helper.waitForTasksFinished().then((_) {
+      // no errors initially
+      List<AnalysisError> errors = helper.getTestErrors();
+      expect(errors, isEmpty);
+      // update code
+      {
+        Request request = new Request('0', AnalysisDomainHandler.UPDATE_CONTENT_METHOD);
+        request.setParameter('files',
+            {
+              helper.testFile : {
+                AnalysisDomainHandler.CONTENT_PARAM : 'library lib'
+              }
+            });
+        helper.handleSuccessfulRequest(request);
+      }
+      // wait, there is an error
+      helper.waitForTasksFinished().then((_) {
+        List<AnalysisError> errors = helper.getTestErrors();
+        expect(errors, hasLength(1));
+      });
+    });
+  });
+
+  test('incremental', () {
+    AnalysisTestHelper helper = new AnalysisTestHelper();
+    helper.createSingleFileProject('library A;');
+    return helper.waitForTasksFinished().then((_) {
+      // no errors initially
+      List<AnalysisError> errors = helper.getTestErrors();
+      expect(errors, isEmpty);
+      // update code
+      {
+        Request request = new Request('0', AnalysisDomainHandler.UPDATE_CONTENT_METHOD);
+        request.setParameter('files',
+            {
+              helper.testFile : {
+                AnalysisDomainHandler.CONTENT_PARAM : 'library lib',
+                AnalysisDomainHandler.OFFSET_PARAM : 'library '.length,
+                AnalysisDomainHandler.OLD_LENGTH_PARAM : 'A;'.length,
+                AnalysisDomainHandler.NEW_LENGTH_PARAM : 'lib'.length,
+              }
+            });
+        helper.handleSuccessfulRequest(request);
+      }
+      // wait, there is an error
+      helper.waitForTasksFinished().then((_) {
+        List<AnalysisError> errors = helper.getTestErrors();
+        expect(errors, hasLength(1));
+      });
+    });
+  });
+}
+
+
+class AnalysisError {
+  final String file;
+  final String errorCode;
+  final int offset;
+  final int length;
+  final String message;
+  final String correction;
+  AnalysisError(this.file, this.errorCode, this.offset, this.length,
+      this.message, this.correction);
+
+  @override
+  String toString() {
+    return 'NotificationError(file=$file; errorCode=$errorCode; '
+        'offset=$offset; length=$length; message=$message)';
+  }
+}
+
+
+AnalysisError jsonToAnalysisError(Map<String, Object> json) {
+  return new AnalysisError(
+      json['file'],
+      json['errorCode'],
+      json['offset'],
+      json['length'],
+      json['message'],
+      json['correction']);
+}
diff --git a/pkg/analysis_server/test/domain_context_test.dart b/pkg/analysis_server/test/domain_context_test.dart
index d8e55e8..adaf6f9 100644
--- a/pkg/analysis_server/test/domain_context_test.dart
+++ b/pkg/analysis_server/test/domain_context_test.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_context.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
@@ -54,7 +55,9 @@
 //  }
 
   static void createChangeSet() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    AnalysisServer server = new AnalysisServer(
+        new MockServerChannel(),
+        PhysicalResourceProvider.INSTANCE);
     Request request = new Request('0', ContextDomainHandler.APPLY_CHANGES_NAME);
     ContextDomainHandler handler = new ContextDomainHandler(server);
     SourceFactory sourceFactory = new SourceFactory([new FileUriResolver()]);
@@ -71,7 +74,9 @@
   }
 
   static void createChangeSet_onlyAdded() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    AnalysisServer server = new AnalysisServer(
+        new MockServerChannel(),
+        PhysicalResourceProvider.INSTANCE);
     Request request = new Request('0', ContextDomainHandler.APPLY_CHANGES_NAME);
     ContextDomainHandler handler = new ContextDomainHandler(server);
     SourceFactory sourceFactory = new SourceFactory([new FileUriResolver()]);
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index 1356816..3ac3eb0 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -7,6 +7,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
@@ -17,7 +18,8 @@
 
   setUp(() {
     var serverChannel = new MockServerChannel();
-    server = new AnalysisServer(serverChannel);
+    var resourceProvider = PhysicalResourceProvider.INSTANCE;
+    server = new AnalysisServer(serverChannel, resourceProvider);
     handler = new ServerDomainHandler(server);
   });
 
@@ -44,9 +46,7 @@
             ServerDomainHandler.SUBSCRIPTIONS_PARAMETER,
             ['noSuchService']);
         var response = handler.handleRequest(request);
-        // TODO(scheglov) extract isResponseError(id) matcher
-        expect(response.id, equals('0'));
-        expect(response.error, isNotNull);
+        expect(response, isResponseFailure('0'));
       });
 
       test('success', () {
@@ -56,9 +56,7 @@
             ServerDomainHandler.SUBSCRIPTIONS_PARAMETER,
             [ServerService.STATUS.name]);
         var response = handler.handleRequest(request);
-        // TODO(scheglov) extract isResponseSuccess(id) matcher
-        expect(response.id, equals('0'));
-        expect(response.error, isNull);
+        expect(response, isResponseSuccess('0'));
         // set of services has been changed
         expect(server.serverServices, contains(ServerService.STATUS));
       });
@@ -69,10 +67,7 @@
       // send request
       var request = new Request('0', ServerDomainHandler.SHUTDOWN_METHOD);
       var response = handler.handleRequest(request);
-      // TODO(scheglov) extract isResponseSuccess(id) matcher
-      expect(response.toJson(), equals({
-        Response.ID: '0'
-      }));
+      expect(response, isResponseSuccess('0'));
       // server is down
       expect(server.running, isFalse);
     });
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 2940115..8f90993 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -51,6 +51,22 @@
 }
 
 /**
+ * Returns a [Future] that completes when the given [AnalysisServer] finished
+ * all its scheduled tasks.
+ */
+Future waitForServerTasksFinished(AnalysisServer server) {
+  if (server.test_areTasksFinished()) {
+    return new Future.value();
+  }
+  // We use a delayed future to allow microtask events to finish. The
+  // Future.value or Future() constructors use scheduleMicrotask themselves and
+  // would therefore not wait for microtask callbacks that are scheduled after
+  // invoking this method.
+  return new Future.delayed(Duration.ZERO,
+      () => waitForServerTasksFinished(server));
+}
+
+/**
  * A mock [WebSocket] for testing.
  */
 class MockSocket<T> implements WebSocket {
@@ -203,3 +219,85 @@
 class MockSource extends Mock implements Source {
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
+
+
+/**
+ * A [Matcher] that check that the given [Response] has an expected identifier
+ * and no error.
+ */
+Matcher isResponseSuccess(String id) => new _IsResponseSuccess(id);
+
+/**
+ * A [Matcher] that check that there are no `error` in a given [Response].
+ */
+class _IsResponseSuccess extends Matcher {
+  final String _id;
+
+  _IsResponseSuccess(this._id);
+
+  @override
+  Description describe(Description description) {
+    return description.addDescriptionOf(
+        'response with identifier "$_id" and without error');
+  }
+
+  @override
+  bool matches(item, Map matchState) {
+    Response response = item;
+    return response.id == _id && response.error == null;
+  }
+
+  @override
+  Description describeMismatch(item, Description mismatchDescription,
+                               Map matchState, bool verbose) {
+    Response response = item;
+    var id = response.id;
+    RequestError error = response.error;
+    mismatchDescription.add('has identifier "$id"');
+    if (error != null) {
+      mismatchDescription.add(' and has error $error');
+    }
+    return mismatchDescription;
+  }
+}
+
+
+/**
+ * A [Matcher] that check that the given [Response] has an expected identifier
+ * and has an error.
+ */
+Matcher isResponseFailure(String id) => new _IsResponseFailure(id);
+
+/**
+ * A [Matcher] that check that there are no `error` in a given [Response].
+ */
+class _IsResponseFailure extends Matcher {
+  final String _id;
+
+  _IsResponseFailure(this._id);
+
+  @override
+  Description describe(Description description) {
+    return description.addDescriptionOf(
+        'response with identifier "$_id" and an error');
+  }
+
+  @override
+  bool matches(item, Map matchState) {
+    Response response = item;
+    return response.id == _id && response.error != null;
+  }
+
+  @override
+  Description describeMismatch(item, Description mismatchDescription,
+                               Map matchState, bool verbose) {
+    Response response = item;
+    var id = response.id;
+    RequestError error = response.error;
+    mismatchDescription.add('has identifier "$id"');
+    if (error == null) {
+      mismatchDescription.add(' and has no error');
+    }
+    return mismatchDescription;
+  }
+}
diff --git a/pkg/analysis_server/test/physical_resource_provider_test.dart b/pkg/analysis_server/test/physical_resource_provider_test.dart
new file mode 100644
index 0000000..00f6ca7
--- /dev/null
+++ b/pkg/analysis_server/test/physical_resource_provider_test.dart
@@ -0,0 +1,226 @@
+// 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.physical.resource.provider;
+
+import 'dart:async';
+import 'dart:io' as io;
+
+import 'mocks.dart';
+
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+import 'package:watcher/watcher.dart';
+
+main() {
+  groupSep = ' | ';
+
+  group('PhysicalResourceProvider', () {
+      io.Directory tempDirectory;
+      String tempPath;
+
+      setUp(() {
+        tempDirectory = io.Directory.systemTemp.createTempSync('test_resource');
+        tempPath = tempDirectory.absolute.path;
+      });
+
+      tearDown(() {
+        tempDirectory.deleteSync(recursive: true);
+      });
+
+      group('Watch', () {
+
+        Future delayed(computation()) {
+          // On Windows, watching the filesystem is accomplished by polling once
+          // per second.  So wait 2 seconds to give time for polling to reliably
+          // occur.
+          return new Future.delayed(new Duration(seconds: 2), computation);
+        }
+
+        watchingFolder(String path, test(List<WatchEvent> changesReceived)) {
+          // Delay before we start watching the folder.  This is necessary
+          // because on MacOS, file modifications that occur just before we start
+          // watching are sometimes misclassified as happening just after we
+          // start watching.
+          return delayed(() {
+            Folder folder = PhysicalResourceProvider.INSTANCE.getResource(path);
+            var changesReceived = <WatchEvent>[];
+            var subscription = folder.changes.listen(changesReceived.add);
+            // Delay running the rest of the test to allow folder.changes to take
+            // a snapshot of the current directory state.  Otherwise it won't be
+            // able to reliably distinguish new files from modified ones.
+            return delayed(() => test(changesReceived)).whenComplete(() {
+              subscription.cancel();
+            });
+          });
+        }
+
+        test('create file', () => watchingFolder(tempPath, (changesReceived) {
+          expect(changesReceived, hasLength(0));
+          var path = join(tempPath, 'foo');
+          new io.File(path).writeAsStringSync('contents');
+          return delayed(() {
+            expect(changesReceived, hasLength(1));
+            expect(changesReceived[0].type, equals(ChangeType.ADD));
+            expect(changesReceived[0].path, equals(path));
+          });
+        }));
+
+        test('modify file', () {
+          var path = join(tempPath, 'foo');
+          var file = new io.File(path);
+          file.writeAsStringSync('contents 1');
+          return watchingFolder(tempPath, (changesReceived) {
+            expect(changesReceived, hasLength(0));
+            file.writeAsStringSync('contents 2');
+            return delayed(() {
+              expect(changesReceived, hasLength(1));
+              expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+              expect(changesReceived[0].path, equals(path));
+            });
+          });
+        });
+
+        test('modify file in subdir', () {
+          var subdirPath = join(tempPath, 'foo');
+          new io.Directory(subdirPath).createSync();
+          var path = join(tempPath, 'bar');
+          var file = new io.File(path);
+          file.writeAsStringSync('contents 1');
+          return watchingFolder(tempPath, (changesReceived) {
+            expect(changesReceived, hasLength(0));
+            file.writeAsStringSync('contents 2');
+            return delayed(() {
+              expect(changesReceived, hasLength(1));
+              expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+              expect(changesReceived[0].path, equals(path));
+            });
+          });
+        });
+
+        test('delete file', () {
+          var path = join(tempPath, 'foo');
+          var file = new io.File(path);
+          file.writeAsStringSync('contents 1');
+          return watchingFolder(tempPath, (changesReceived) {
+            expect(changesReceived, hasLength(0));
+            file.deleteSync();
+            return delayed(() {
+              expect(changesReceived, hasLength(1));
+              expect(changesReceived[0].type, equals(ChangeType.REMOVE));
+              expect(changesReceived[0].path, equals(path));
+            });
+          });
+        });
+      });
+
+      group('File', () {
+        String path;
+        File file;
+
+        setUp(() {
+          path = join(tempPath, 'file.txt');
+          file = PhysicalResourceProvider.INSTANCE.getResource(path);
+        });
+
+        test('createSource', () {
+          new io.File(path).writeAsStringSync('contents');
+          var source = file.createSource(UriKind.FILE_URI);
+          expect(source.uriKind, UriKind.FILE_URI);
+          expect(source.exists(), isTrue);
+          expect(source.contents.data, 'contents');
+        });
+
+        group('exists', () {
+          test('false', () {
+            expect(file.exists, isFalse);
+          });
+
+          test('true', () {
+            new io.File(path).writeAsStringSync('contents');
+            expect(file.exists, isTrue);
+          });
+        });
+
+        test('fullName', () {
+          expect(file.path, path);
+        });
+
+        test('hashCode', () {
+          file.hashCode;
+        });
+
+        test('shortName', () {
+          expect(file.shortName, 'file.txt');
+        });
+
+        test('toString', () {
+          expect(file.toString(), path);
+        });
+      });
+
+      group('Folder', () {
+        String path;
+        Folder folder;
+
+        setUp(() {
+          path = join(tempPath, 'folder');
+          new io.Directory(path).createSync();
+          folder = PhysicalResourceProvider.INSTANCE.getResource(path);
+        });
+
+        group('getChild', () {
+          test('does not exist', () {
+            var child = folder.getChild('no-such-resource');
+            expect(child, isNotNull);
+            expect(child.exists, isFalse);
+          });
+
+          test('file', () {
+            new io.File(join(path, 'myFile')).createSync();
+            var child = folder.getChild('myFile');
+            expect(child, _isFile);
+            expect(child.exists, isTrue);
+          });
+
+          test('folder', () {
+            new io.Directory(join(path, 'myFolder')).createSync();
+            var child = folder.getChild('myFolder');
+            expect(child, _isFolder);
+            expect(child.exists, isTrue);
+          });
+        });
+
+        test('getChildren', () {
+          // create 2 files and 1 folder
+          new io.File(join(path, 'a.txt')).createSync();
+          new io.Directory(join(path, 'bFolder')).createSync();
+          new io.File(join(path, 'c.txt')).createSync();
+          // prepare 3 children
+          List<Resource> children = folder.getChildren();
+          expect(children, hasLength(3));
+          children.sort((a, b) => a.shortName.compareTo(b.shortName));
+          // check that each child exists
+          children.forEach((child) {
+            expect(child.exists, true);
+          });
+          // check names
+          expect(children[0].shortName, 'a.txt');
+          expect(children[1].shortName, 'bFolder');
+          expect(children[2].shortName, 'c.txt');
+          // check types
+          expect(children[0], _isFile);
+          expect(children[1], _isFolder);
+          expect(children[2], _isFile);
+        });
+      });
+    });
+}
+
+var _isFile = new isInstanceOf<File>();
+var _isFolder = new isInstanceOf<Folder>();
+var _isMemoryResourceException = new isInstanceOf<MemoryResourceException>();
diff --git a/pkg/analysis_server/test/resource_test.dart b/pkg/analysis_server/test/resource_test.dart
index 4818dc6..a7b58bf 100644
--- a/pkg/analysis_server/test/resource_test.dart
+++ b/pkg/analysis_server/test/resource_test.dart
@@ -4,13 +4,17 @@
 
 library test.resource;
 
+import 'dart:async';
 import 'dart:io' as io;
 
+import 'mocks.dart';
+
 import 'package:analysis_server/src/resource.dart';
 import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
+import 'package:watcher/watcher.dart';
 
 main() {
   groupSep = ' | ';
@@ -22,6 +26,190 @@
       provider = new MemoryResourceProvider();
     });
 
+    test('MemoryResourceException', () {
+      var exception = new MemoryResourceException('/my/path', 'my message');
+      expect(exception.path, '/my/path');
+      expect(exception.message, 'my message');
+      expect(exception.toString(),
+          'MemoryResourceException(path=/my/path; message=my message)');
+    });
+
+    group('Watch', () {
+
+      Future delayed(computation()) {
+        return pumpEventQueue().then((_) => computation());
+      }
+
+      watchingFolder(String path, test(List<WatchEvent> changesReceived)) {
+        Folder folder = provider.getResource(path);
+        var changesReceived = <WatchEvent>[];
+        folder.changes.listen(changesReceived.add);
+        return test(changesReceived);
+      }
+
+      test('create file', () {
+        String rootPath = '/my/path';
+        provider.newFolder(rootPath);
+        watchingFolder(rootPath, (changesReceived) {
+          expect(changesReceived, hasLength(0));
+          String path = posix.join(rootPath, 'foo');
+          provider.newFile(path, 'contents');
+          return delayed(() {
+            expect(changesReceived, hasLength(1));
+            expect(changesReceived[0].type, equals(ChangeType.ADD));
+            expect(changesReceived[0].path, equals(path));
+          });
+        });
+      });
+
+      test('modify file', () {
+        String rootPath = '/my/path';
+        provider.newFolder(rootPath);
+        String path = posix.join(rootPath, 'foo');
+        provider.newFile(path, 'contents 1');
+        return watchingFolder(rootPath, (changesReceived) {
+          expect(changesReceived, hasLength(0));
+          provider.modifyFile(path, 'contents 2');
+          return delayed(() {
+            expect(changesReceived, hasLength(1));
+            expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+            expect(changesReceived[0].path, equals(path));
+          });
+        });
+      });
+
+      test('modify file in subdir', () {
+        String rootPath = '/my/path';
+        provider.newFolder(rootPath);
+        String subdirPath = posix.join(rootPath, 'foo');
+        provider.newFolder(subdirPath);
+        String path = posix.join(rootPath, 'bar');
+        provider.newFile(path, 'contents 1');
+        return watchingFolder(rootPath, (changesReceived) {
+          expect(changesReceived, hasLength(0));
+          provider.modifyFile(path, 'contents 2');
+          return delayed(() {
+            expect(changesReceived, hasLength(1));
+            expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+            expect(changesReceived[0].path, equals(path));
+          });
+        });
+      });
+
+      test('delete file', () {
+        String rootPath = '/my/path';
+        provider.newFolder(rootPath);
+        String path = posix.join(rootPath, 'foo');
+        provider.newFile(path, 'contents 1');
+        return watchingFolder(rootPath, (changesReceived) {
+          expect(changesReceived, hasLength(0));
+          provider.deleteFile(path);
+          return delayed(() {
+            expect(changesReceived, hasLength(1));
+            expect(changesReceived[0].type, equals(ChangeType.REMOVE));
+            expect(changesReceived[0].path, equals(path));
+          });
+        });
+      });
+    });
+
+    group('newFolder', () {
+      test('empty path', () {
+        expect(
+          () {
+            provider.newFolder('');
+          },
+          throwsA(new isInstanceOf<ArgumentError>())
+        );
+      });
+
+      test('not absolute', () {
+        expect(
+          () {
+            provider.newFolder('not/absolute');
+          },
+          throwsA(new isInstanceOf<ArgumentError>())
+        );
+      });
+
+      group('already exists', () {
+        test('as folder', () {
+          Folder folder = provider.newFolder('/my/folder');
+          Folder newFolder = provider.newFolder('/my/folder');
+          expect(newFolder, folder);
+        });
+
+        test('as file', () {
+          File file = provider.newFile('/my/file', 'qwerty');
+          expect(
+            () {
+            provider.newFolder('/my/file');
+            },
+            throwsA(new isInstanceOf<ArgumentError>())
+          );
+        });
+      });
+    });
+
+    group('modifyFile', () {
+      test('nonexistent', () {
+        String path = '/my/file';
+        expect(() { provider.modifyFile(path, 'contents'); },
+            throwsA(new isInstanceOf<ArgumentError>()));
+        Resource file = provider.getResource(path);
+        expect(file, isNotNull);
+        expect(file.exists, isFalse);
+      });
+
+      test('is folder', () {
+        String path = '/my/file';
+        provider.newFolder(path);
+        expect(() { provider.modifyFile(path, 'contents'); },
+            throwsA(new isInstanceOf<ArgumentError>()));
+        expect(provider.getResource(path), new isInstanceOf<Folder>());
+      });
+
+      test('successful', () {
+        String path = '/my/file';
+        provider.newFile(path, 'contents 1');
+        Resource file = provider.getResource(path);
+        expect(file, new isInstanceOf<File>());
+        Source source = (file as File).createSource(UriKind.FILE_URI);
+        expect(source.contents.data, equals('contents 1'));
+        provider.modifyFile(path, 'contents 2');
+        expect(source.contents.data, equals('contents 2'));
+      });
+    });
+
+    group('deleteFile', () {
+      test('nonexistent', () {
+        String path = '/my/file';
+        expect(() { provider.deleteFile(path); },
+            throwsA(new isInstanceOf<ArgumentError>()));
+        Resource file = provider.getResource(path);
+        expect(file, isNotNull);
+        expect(file.exists, isFalse);
+      });
+
+      test('is folder', () {
+        String path = '/my/file';
+        provider.newFolder(path);
+        expect(() { provider.deleteFile(path); },
+            throwsA(new isInstanceOf<ArgumentError>()));
+        expect(provider.getResource(path), new isInstanceOf<Folder>());
+      });
+
+      test('successful', () {
+        String path = '/my/file';
+        provider.newFile(path, 'contents');
+        Resource file = provider.getResource(path);
+        expect(file, new isInstanceOf<File>());
+        expect(file.exists, isTrue);
+        provider.deleteFile(path);
+        expect(file.exists, isFalse);
+      });
+    });
+
     group('File', () {
       group('==', () {
         test('false', () {
@@ -54,7 +242,7 @@
 
       test('fullName', () {
         File file = provider.getResource('/foo/bar/file.txt');
-        expect(file.fullName, '/foo/bar/file.txt');
+        expect(file.path, '/foo/bar/file.txt');
       });
 
       test('hashCode', () {
@@ -134,6 +322,39 @@
           source = file.createSource(UriKind.FILE_URI);
         });
 
+        group('==', () {
+          group('true', () {
+            test('self', () {
+              File file = provider.newFile('/foo/test.dart', '');
+              Source source = file.createSource(UriKind.FILE_URI);
+              expect(source == source, isTrue);
+            });
+
+            test('same file', () {
+              File file = provider.newFile('/foo/test.dart', '');
+              Source sourceA = file.createSource(UriKind.FILE_URI);
+              Source sourceB = file.createSource(UriKind.FILE_URI);
+              expect(sourceA == sourceB, isTrue);
+            });
+          });
+
+          group('false', () {
+            test('not a memory Source', () {
+              File file = provider.newFile('/foo/test.dart', '');
+              Source source = file.createSource(UriKind.FILE_URI);
+              expect(source == new Object(), isFalse);
+            });
+
+            test('different file', () {
+              File fileA = provider.newFile('/foo/a.dart', '');
+              File fileB = provider.newFile('/foo/b.dart', '');
+              Source sourceA = fileA.createSource(UriKind.FILE_URI);
+              Source sourceB = fileB.createSource(UriKind.FILE_URI);
+              expect(sourceA == sourceB, isFalse);
+            });
+          });
+        });
+
         test('contents', () {
           TimestampedData<String> contents = source.contents;
           expect(contents.data, 'library test;');
@@ -151,6 +372,10 @@
           expect(source.fullName, '/foo/test.dart');
         });
 
+        test('hashCode', () {
+          source.hashCode;
+        });
+
         test('shortName', () {
           expect(source.shortName, 'test.dart');
         });
@@ -199,121 +424,6 @@
       });
     });
   });
-
-  group('PhysicalResourceProvider', () {
-    io.Directory tempDirectory;
-    String tempPath;
-
-    setUp(() {
-      tempDirectory = io.Directory.systemTemp.createTempSync('test_resource');
-      tempPath = tempDirectory.absolute.path;
-    });
-
-    tearDown(() {
-      tempDirectory.deleteSync(recursive: true);
-    });
-
-    group('File', () {
-      String path;
-      File file;
-
-      setUp(() {
-        path = join(tempPath, 'file.txt');
-        file = PhysicalResourceProvider.INSTANCE.getResource(path);
-      });
-
-      test('createSource', () {
-        new io.File(path).writeAsStringSync('contents');
-        var source = file.createSource(UriKind.FILE_URI);
-        expect(source.uriKind, UriKind.FILE_URI);
-        expect(source.exists(), isTrue);
-        expect(source.contents.data, 'contents');
-      });
-
-      group('exists', () {
-        test('false', () {
-          expect(file.exists, isFalse);
-        });
-
-        test('true', () {
-          new io.File(path).writeAsStringSync('contents');
-          expect(file.exists, isTrue);
-        });
-      });
-
-      test('fullName', () {
-        expect(file.fullName, path);
-      });
-
-      test('hashCode', () {
-        file.hashCode;
-      });
-
-      test('shortName', () {
-        expect(file.shortName, 'file.txt');
-      });
-
-      test('toString', () {
-        expect(file.toString(), path);
-      });
-    });
-
-    group('Folder', () {
-      String path;
-      Folder folder;
-
-      setUp(() {
-        path = join(tempPath, 'folder');
-        new io.Directory(path).createSync();
-        folder = PhysicalResourceProvider.INSTANCE.getResource(path);
-      });
-
-      group('getChild', () {
-        test('does not exist', () {
-          var child = folder.getChild('no-such-resource');
-          expect(child, isNotNull);
-          expect(child.exists, isFalse);
-        });
-
-        test('file', () {
-          new io.File(join(path, 'myFile')).createSync();
-          var child = folder.getChild('myFile');
-          expect(child, _isFile);
-          expect(child.exists, isTrue);
-        });
-
-        test('folder', () {
-          new io.Directory(join(path, 'myFolder')).createSync();
-          var child = folder.getChild('myFolder');
-          expect(child, _isFolder);
-          expect(child.exists, isTrue);
-        });
-      });
-
-      test('getChildren', () {
-        // create 2 files and 1 folder
-        new io.File(join(path, 'a.txt')).createSync();
-        new io.Directory(join(path, 'bFolder')).createSync();
-        new io.File(join(path, 'c.txt')).createSync();
-        // prepare 3 children
-        List<Resource> children = folder.getChildren();
-        expect(children, hasLength(3));
-        children.sort((a, b) => a.shortName.compareTo(b.shortName));
-        // check that each child exists
-        children.forEach((child) {
-          expect(child.exists, true);
-        });
-        // check names
-        expect(children[0].shortName, 'a.txt');
-        expect(children[1].shortName, 'bFolder');
-        expect(children[2].shortName, 'c.txt');
-        // check types
-        expect(children[0], _isFile);
-        expect(children[1], _isFolder);
-        expect(children[2], _isFile);
-      });
-    });
-  });
 }
 
 var _isFile = new isInstanceOf<File>();
diff --git a/pkg/analysis_services/lib/src/generated/completion.dart b/pkg/analysis_services/lib/src/generated/completion.dart
index d2c50c6..a49b805 100644
--- a/pkg/analysis_services/lib/src/generated/completion.dart
+++ b/pkg/analysis_services/lib/src/generated/completion.dart
@@ -1912,7 +1912,7 @@
   void _addNamesDefinedByHierarchy2(InterfaceType type, bool forSuper) {
     List<InterfaceType> superTypes = type.element.allSupertypes;
     if (!forSuper) {
-      superTypes.insert(0, type);
+      superTypes = ArrayUtils.addAt(superTypes, 0, type);
     }
     _addNamesDefinedByTypes(superTypes);
     // Collect names defined by subtypes separately so they can be identified later.
diff --git a/pkg/analysis_services/pubspec.yaml b/pkg/analysis_services/pubspec.yaml
index b2059ef..5bb7dca 100644
--- a/pkg/analysis_services/pubspec.yaml
+++ b/pkg/analysis_services/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analysis_services
-version: 0.0.2
+version: 0.0.3
 author: Dart Team <misc@dartlang.org>
 description: A set of services on top of Analysis Engine
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index e25cee5..d6aa8b5 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -10,6 +10,7 @@
 
 import 'package:path/path.dart' as pathos;
 
+import 'generated/constant.dart';
 import 'generated/engine.dart';
 import 'generated/element.dart';
 import 'generated/error.dart';
@@ -251,6 +252,13 @@
     sourceFactory = new SourceFactory(resolvers);
     context = AnalysisEngine.instance.createAnalysisContext();
     context.sourceFactory = sourceFactory;
+    Map<String, String> definedVariables = options.definedVariables;
+    if (!definedVariables.isEmpty) {
+      DeclaredVariables declaredVariables = context.declaredVariables;
+      definedVariables.forEach((String variableName, String value) {
+        declaredVariables.define(variableName, value);
+      });
+    }
     // Uncomment the following to have errors reported on stdout and stderr
     AnalysisEngine.instance.logger = new StdLogger(options.log);
 
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
index 0b702b9..3375adf 100644
--- a/pkg/barback/CHANGELOG.md
+++ b/pkg/barback/CHANGELOG.md
@@ -1,3 +1,18 @@
+## 0.14.1
+
+* Add an `AggregateTransformer` type. Aggregate transformers transform groups of
+  assets for which no single asset is primary. For example, one could be used to
+  merge all images in a directory into a single file.
+
+* Add a `message` getter to `TransformerException` and `AssetLoadException`.
+
+* Fix a bug where transformers would occasionally emit stale output after their
+  inputs changed.
+
+## 0.14.0+3
+
+* Properly handle synchronous errors in `PackageProvider.getAsset()`.
+
 ## 0.14.0+2
 
 * Fix a bug with the previous bug fix.
diff --git a/pkg/barback/lib/barback.dart b/pkg/barback/lib/barback.dart
index c39646a..3975758 100644
--- a/pkg/barback/lib/barback.dart
+++ b/pkg/barback/lib/barback.dart
@@ -12,10 +12,15 @@
 export 'src/errors.dart' hide flattenAggregateExceptions;
 export 'src/log.dart';
 export 'src/package_provider.dart';
+export 'src/transformer/aggregate_transform.dart';
+export 'src/transformer/aggregate_transformer.dart';
 export 'src/transformer/barback_settings.dart';
 export 'src/transformer/base_transform.dart';
+export 'src/transformer/declaring_aggregate_transform.dart';
+export 'src/transformer/declaring_aggregate_transformer.dart';
 export 'src/transformer/declaring_transform.dart' hide newDeclaringTransform;
 export 'src/transformer/declaring_transformer.dart';
+export 'src/transformer/lazy_aggregate_transformer.dart';
 export 'src/transformer/lazy_transformer.dart';
 export 'src/transformer/transform.dart' hide newTransform;
 export 'src/transformer/transform_logger.dart';
diff --git a/pkg/barback/lib/src/barback.dart b/pkg/barback/lib/src/barback.dart
index e8cbedc..98d1154 100644
--- a/pkg/barback/lib/src/barback.dart
+++ b/pkg/barback/lib/src/barback.dart
@@ -110,9 +110,8 @@
   /// To the extent that [transformers] is similar to the previous transformer
   /// phases for [package], the existing asset graph will be preserved.
   ///
-  /// Elements of the inner iterable of [transformers] must be either
-  /// [Transformer]s or [TransformerGroup]s.
-  void updateTransformers(String package,
-          Iterable<Iterable> transformers) =>
+  /// Elements of the inner iterable of [transformers] must be [Transformer]s,
+  /// [TransformerGroup]s, or [AggregateTransformer]s.
+  void updateTransformers(String package, Iterable<Iterable> transformers) =>
       _graph.updateTransformers(package, transformers);
 }
diff --git a/pkg/barback/lib/src/errors.dart b/pkg/barback/lib/src/errors.dart
index 0c2b5c5..3488e31 100644
--- a/pkg/barback/lib/src/errors.dart
+++ b/pkg/barback/lib/src/errors.dart
@@ -115,14 +115,16 @@
   final error;
   final Chain stackTrace;
 
+  String get message => "$_message: ${getErrorMessage(error)}";
+
+  String get _message;
+
   _WrappedException(error, StackTrace stackTrace)
       : this.error = error,
         this.stackTrace = _getChain(error, stackTrace);
 
-  String get _message;
-
   String toString() {
-    var result = "$_message: $error";
+    var result = message;
     if (stackTrace != null) result = "$result\n${stackTrace.terse}";
     return result;
   }
diff --git a/pkg/barback/lib/src/graph/asset_cascade.dart b/pkg/barback/lib/src/graph/asset_cascade.dart
index ca08785..aca3588 100644
--- a/pkg/barback/lib/src/graph/asset_cascade.dart
+++ b/pkg/barback/lib/src/graph/asset_cascade.dart
@@ -13,6 +13,7 @@
 import '../errors.dart';
 import '../log.dart';
 import '../transformer/transformer.dart';
+import '../utils.dart';
 import '../utils/cancelable_future.dart';
 import 'node_status.dart';
 import 'node_streams.dart';
@@ -138,8 +139,8 @@
       // return out-of-date contents for the asset.
       if (_loadingSources.containsKey(id)) _loadingSources[id].cancel();
 
-      _loadingSources[id] =
-          new CancelableFuture<Asset>(graph.provider.getAsset(id));
+      _loadingSources[id] = new CancelableFuture<Asset>(
+          syncFuture(() => graph.provider.getAsset(id)));
       _loadingSources[id].whenComplete(() {
         _loadingSources.remove(id);
       }).then((asset) {
@@ -167,8 +168,8 @@
 
   /// Sets this cascade's transformer phases to [transformers].
   ///
-  /// Elements of the inner iterable of [transformers] must be either
-  /// [Transformer]s or [TransformerGroup]s.
+  /// Elements of the inner iterable of [transformers] must be [Transformer]s,
+  /// [TransformerGroup]s, or [AggregateTransformer]s.
   void updateTransformers(Iterable<Iterable> transformersIterable) {
     var transformers = transformersIterable.toList();
 
diff --git a/pkg/barback/lib/src/graph/group_runner.dart b/pkg/barback/lib/src/graph/group_runner.dart
index e609ba2..f9dcaa1 100644
--- a/pkg/barback/lib/src/graph/group_runner.dart
+++ b/pkg/barback/lib/src/graph/group_runner.dart
@@ -10,7 +10,6 @@
 import '../log.dart';
 import '../transformer/transformer_group.dart';
 import '../utils/stream_pool.dart';
-import 'asset_cascade.dart';
 import 'node_status.dart';
 import 'phase.dart';
 
diff --git a/pkg/barback/lib/src/graph/package_graph.dart b/pkg/barback/lib/src/graph/package_graph.dart
index 8cd4715..e4664d9 100644
--- a/pkg/barback/lib/src/graph/package_graph.dart
+++ b/pkg/barback/lib/src/graph/package_graph.dart
@@ -14,7 +14,6 @@
 import '../errors.dart';
 import '../log.dart';
 import '../package_provider.dart';
-import '../transformer/transformer.dart';
 import '../utils.dart';
 import 'asset_cascade.dart';
 import 'node_status.dart';
@@ -184,8 +183,7 @@
     _tryScheduleResult();
   }
 
-  void updateTransformers(String package,
-      Iterable<Iterable<Transformer>> transformers) {
+  void updateTransformers(String package, Iterable<Iterable> transformers) {
     _inErrorZone(() => _cascades[package].updateTransformers(transformers));
 
     // It's possible for updating transformers not to cause any processing. The
diff --git a/pkg/barback/lib/src/graph/phase.dart b/pkg/barback/lib/src/graph/phase.dart
index a4724ab..a775323 100644
--- a/pkg/barback/lib/src/graph/phase.dart
+++ b/pkg/barback/lib/src/graph/phase.dart
@@ -11,6 +11,7 @@
 import '../asset/asset_node_set.dart';
 import '../errors.dart';
 import '../log.dart';
+import '../transformer/aggregate_transformer.dart';
 import '../transformer/transformer.dart';
 import '../transformer/transformer_group.dart';
 import '../utils.dart';
@@ -55,7 +56,9 @@
   final _inputs = new AssetNodeSet();
 
   /// The transformer classifiers for this phase.
-  final _classifiers = new Map<Transformer, TransformerClassifier>();
+  ///
+  /// The keys can be either [Transformer]s or [AggregateTransformer]s.
+  final _classifiers = new Map<dynamic, TransformerClassifier>();
 
   /// The forwarders for this phase.
   final _forwarders = new Map<AssetId, PhaseForwarder>();
@@ -233,7 +236,8 @@
 
   /// Set this phase's transformers to [transformers].
   void updateTransformers(Iterable transformers) {
-    var newTransformers = transformers.where((op) => op is Transformer)
+    var newTransformers = transformers
+        .where((op) => op is Transformer || op is AggregateTransformer)
         .toSet();
     var oldTransformers = _classifiers.keys.toSet();
     for (var removed in oldTransformers.difference(newTransformers)) {
diff --git a/pkg/barback/lib/src/graph/transform_node.dart b/pkg/barback/lib/src/graph/transform_node.dart
index 5ef4b81..901d79e 100644
--- a/pkg/barback/lib/src/graph/transform_node.dart
+++ b/pkg/barback/lib/src/graph/transform_node.dart
@@ -21,6 +21,7 @@
 import 'node_status.dart';
 import 'node_streams.dart';
 import 'phase.dart';
+import 'transformer_classifier.dart';
 
 /// Describes a transform on a set of assets and its relationship to the build
 /// dependency graph.
@@ -31,8 +32,11 @@
   /// The aggregate key for this node.
   final String key;
 
+  /// The [TransformerClassifier] that [this] belongs to.
+  final TransformerClassifier classifier;
+
   /// The [Phase] that this transform runs in.
-  final Phase phase;
+  Phase get phase => classifier.phase;
 
   /// The [AggregateTransformer] to apply to this node's inputs.
   final AggregateTransformer transformer;
@@ -162,7 +166,7 @@
   /// [_State.NEEDS_DECLARE], and always `null` otherwise.
   AggregateTransformController _applyController;
 
-  TransformNode(this.phase, this.transformer, this.key, this._location) {
+  TransformNode(this.classifier, this.transformer, this.key, this._location) {
     _forced = transformer is! DeclaringAggregateTransformer;
 
     _phaseAssetSubscription = phase.previous.onAsset.listen((node) {
@@ -178,6 +182,11 @@
       _maybeFinishApplyController();
     });
 
+    classifier.onDoneClassifying.listen((_) {
+      _maybeFinishDeclareController();
+      _maybeFinishApplyController();
+    });
+
     _run();
   }
 
@@ -198,7 +207,13 @@
       // If we're running `apply`, we need to wait until [input] is available
       // before we pass it into the stream. If it's available now, great; if
       // not, [_onPrimaryStateChange] will handle it.
-      if (!input.state.isAvailable) return;
+      if (!input.state.isAvailable) {
+        // If we started running eagerly without being forced, abort that run if
+        // a new unavailable asset comes in.
+        if (input.isLazy && !_forced) _restartRun();
+        return;
+      }
+
       _onPrimaryStateChange(input);
       _maybeFinishApplyController();
     } else {
@@ -326,9 +341,12 @@
       }
     } else {
       if (_forced) input.force();
-      if (_state == _State.APPLYING && !_applyController.addedId(input.id)) {
+      if (_state == _State.APPLYING && !_applyController.addedId(input.id) &&
+          (_forced || !input.isLazy)) {
         // If the input hasn't yet been added to the transform's input stream,
-        // there's no need to consider the transformation dirty.
+        // there's no need to consider the transformation dirty. However, if the
+        // input is lazy and we're running eagerly, we need to restart the
+        // transformation.
         return;
       }
       _dirty();
@@ -389,6 +407,7 @@
     for (var primary in _primaries) {
       controller.addId(primary.id);
     }
+    _maybeFinishDeclareController();
 
     syncFuture(() {
       return (transformer as DeclaringAggregateTransformer)
@@ -557,6 +576,7 @@
       if (!primary.state.isAvailable) continue;
       controller.addInput(primary.asset);
     }
+    _maybeFinishApplyController();
 
     return syncFuture(() {
       return transformer.apply(controller.transform);
@@ -691,6 +711,7 @@
   /// outputs, mark [_declareController] as done.
   void _maybeFinishDeclareController() {
     if (_declareController == null) return;
+    if (classifier.isClassifying) return;
     if (phase.previous.status == NodeStatus.RUNNING) return;
     _declareController.done();
   }
@@ -700,6 +721,7 @@
   /// transformer, mark [_applyController] as done.
   void _maybeFinishApplyController() {
     if (_applyController == null) return;
+    if (classifier.isClassifying) return;
     if (_primaries.any((input) => !input.state.isAvailable)) return;
     if (phase.previous.status == NodeStatus.RUNNING) return;
     _applyController.done();
diff --git a/pkg/barback/lib/src/graph/transformer_classifier.dart b/pkg/barback/lib/src/graph/transformer_classifier.dart
index 9a59f57..a095e8d 100644
--- a/pkg/barback/lib/src/graph/transformer_classifier.dart
+++ b/pkg/barback/lib/src/graph/transformer_classifier.dart
@@ -26,7 +26,7 @@
 /// and `null` if `isPrimary` is `null`.
 class TransformerClassifier {
   /// The containing [Phase].
-  final Phase _phase;
+  final Phase phase;
 
   /// The [AggregateTransformer] used to classify the inputs.
   final AggregateTransformer transformer;
@@ -46,19 +46,28 @@
   Stream<AssetNode> get onAsset => _streams.onAsset;
   Stream<LogEntry> get onLog => _streams.onLog;
 
+  /// A broadcast stream that emits an event whenever [this] has finished
+  /// classifying all available inputs.
+  Stream get onDoneClassifying => _onDoneClassifyingController.stream;
+  final _onDoneClassifyingController =
+      new StreamController.broadcast(sync: true);
+
   /// The number of currently-active calls to [transformer.classifyPrimary].
   ///
   /// This is used to determine whether [this] is dirty.
   var _activeClassifications = 0;
 
+  /// Whether this is currently classifying any inputs.
+  bool get isClassifying => _activeClassifications > 0;
+
   /// How far along [this] is in processing its assets.
   NodeStatus get status {
-    if (_activeClassifications > 0) return NodeStatus.RUNNING;
+    if (isClassifying) return NodeStatus.RUNNING;
     return NodeStatus.dirtiest(
         _transforms.values.map((transform) => transform.status));
   }
 
-  TransformerClassifier(this._phase, transformer, this._location)
+  TransformerClassifier(this.phase, transformer, this._location)
       : transformer = transformer is AggregateTransformer ?
             transformer : new WrappingAggregateTransformer(transformer);
 
@@ -67,7 +76,7 @@
     _activeClassifications++;
     syncFuture(() => transformer.classifyPrimary(input.id)).catchError(
         (error, stackTrace) {
-      if (input.state.isRemoved) return false;
+      if (input.state.isRemoved) return null;
 
       // Catch all transformer errors and pipe them to the results stream. This
       // is so a broken transformer doesn't take down the whole graph.
@@ -77,9 +86,9 @@
       } else {
         error = new MissingInputException(info, error.id);
       }
-      _phase.cascade.reportError(error);
+      phase.cascade.reportError(error);
 
-      return false;
+      return null;
     }).then((key) {
       if (input.state.isRemoved) return;
       if (key == null) {
@@ -91,12 +100,15 @@
       } else if (_transforms.containsKey(key)) {
         _transforms[key].addPrimary(input);
       } else {
-        var transform = new TransformNode(_phase, transformer, key, _location);
+        var transform = new TransformNode(this, transformer, key, _location);
         _transforms[key] = transform;
 
         transform.onStatusChange.listen(
             (_) => _streams.changeStatus(status),
-            onDone: () => _transforms.remove(input.id.path));
+            onDone: () {
+          _transforms.remove(transform.key);
+          if (!_streams.isClosed) _streams.changeStatus(status);
+        });
 
         _streams.onAssetPool.add(transform.onAsset);
         _streams.onLogPool.add(transform.onLog);
@@ -104,7 +116,9 @@
       }
     }).whenComplete(() {
       _activeClassifications--;
-      if (!_streams.isClosed) _streams.changeStatus(status);
+      if (_streams.isClosed) return;
+      if (!isClassifying) _onDoneClassifyingController.add(null);
+      _streams.changeStatus(status);
     });
   }
 
@@ -113,6 +127,7 @@
   /// This marks all outputs of the transformer as removed.
   void remove() {
     _streams.close();
+    _onDoneClassifyingController.close();
     for (var transform in _transforms.values.toList()) {
       transform.remove();
     }
diff --git a/pkg/barback/lib/src/serialize.dart b/pkg/barback/lib/src/serialize.dart
index 1458463..10cc6fe 100644
--- a/pkg/barback/lib/src/serialize.dart
+++ b/pkg/barback/lib/src/serialize.dart
@@ -104,21 +104,10 @@
     if (stack == null && error is Error) stack = error.stackTrace;
     return {
       'type': error.runtimeType.toString(),
-      'message': _getErrorMessage(error),
+      '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, '');
diff --git a/pkg/barback/lib/src/transformer/aggregate_transform.dart b/pkg/barback/lib/src/transformer/aggregate_transform.dart
index 27491fb..854f371 100644
--- a/pkg/barback/lib/src/transformer/aggregate_transform.dart
+++ b/pkg/barback/lib/src/transformer/aggregate_transform.dart
@@ -29,6 +29,9 @@
   /// the assets in this transform.
   String get key => _node.key;
 
+  /// The package in which this transform is running.
+  String get package => _node.phase.cascade.package;
+
   /// The stream of primary inputs that will be processed by this transform.
   ///
   /// This is exposed as a stream so that the transformer can start working
@@ -40,25 +43,19 @@
   /// closed. For example, it may know that each key will only have two inputs
   /// associated with it, and so use `transform.primaryInputs.take(2)` to access
   /// only those inputs.
-  Stream<Asset> get primaryInputs => _primaryInputs;
-  Stream<Asset> _primaryInputs;
-
-  /// The controller for [primaryInputs].
-  ///
-  /// This is a broadcast controller so that the transform can keep
-  /// [_emittedPrimaryInputs] up to date.
-  final _inputController = new StreamController<Asset>.broadcast();
+  Stream<Asset> get primaryInputs => _inputController.stream;
+  final _inputController = new StreamController<Asset>();
 
   /// The set of all primary inputs that have been emitted by [primaryInputs].
+  ///
+  /// This is populated by the transform's controller so that
+  /// [AggregateTransformController.addedId] synchronously returns the correct
+  /// result after [AggregateTransformController.addInput] is called.
   final _emittedPrimaryInputs = new AssetSet();
 
   AggregateTransform._(TransformNode node)
       : _node = node,
-        super(node) {
-    _inputController.stream.listen(_emittedPrimaryInputs.add);
-    // [primaryInputs] should be a non-broadcast stream.
-    _primaryInputs = broadcastToSingleSubscription(_inputController.stream);
-  }
+        super(node);
 
   /// Gets the asset for an input [id].
   ///
@@ -139,12 +136,14 @@
 
   /// Adds a primary input asset to the [AggregateTransform.primaryInputs]
   /// stream.
-  void addInput(Asset input) => transform._inputController.add(input);
+  void addInput(Asset input) {
+    transform._emittedPrimaryInputs.add(input);
+    transform._inputController.add(input);
+  }
 
   /// Returns whether an input with the given [id] was added via [addInput].
-  bool addedId(AssetId id) {
-    return transform._emittedPrimaryInputs.ids.contains(id);
-  }
+  bool addedId(AssetId id) =>
+      transform._emittedPrimaryInputs.containsId(id);
 
   void done() {
     transform._inputController.close();
diff --git a/pkg/barback/lib/src/transformer/declaring_aggregate_transform.dart b/pkg/barback/lib/src/transformer/declaring_aggregate_transform.dart
index 5eada09..cfcb782 100644
--- a/pkg/barback/lib/src/transformer/declaring_aggregate_transform.dart
+++ b/pkg/barback/lib/src/transformer/declaring_aggregate_transform.dart
@@ -24,6 +24,9 @@
   /// the assets in this transform.
   final String key;
 
+  /// The package in which this transform is running.
+  final String package;
+
   /// The stream of primary input ids that have been aggregated for this
   /// transform.
   ///
@@ -50,6 +53,7 @@
 
   DeclaringAggregateTransform._(TransformNode node)
       : key = node.key,
+        package = node.phase.cascade.package,
         super(node) {
     _idController.stream.listen(_emittedPrimaryIds.add);
     // [primaryIds] should be a non-broadcast stream.
diff --git a/pkg/barback/lib/src/utils.dart b/pkg/barback/lib/src/utils.dart
index d5a9fb62..c26c7e8 100644
--- a/pkg/barback/lib/src/utils.dart
+++ b/pkg/barback/lib/src/utils.dart
@@ -325,3 +325,14 @@
       onDone: controller.close);
   return controller.stream;
 }
+
+/// 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, '');
diff --git a/pkg/barback/lib/src/utils/cancelable_future.dart b/pkg/barback/lib/src/utils/cancelable_future.dart
index ff723b2..64d2b5f 100644
--- a/pkg/barback/lib/src/utils/cancelable_future.dart
+++ b/pkg/barback/lib/src/utils/cancelable_future.dart
@@ -14,7 +14,7 @@
 /// running.
 class CancelableFuture<T> implements Future<T> {
   bool _canceled = false;
-  final _completer = new Completer<T>();
+  final _completer = new Completer<T>.sync();
 
   CancelableFuture(Future<T> inner) {
     inner.then((result) {
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 1499cb8..bbfd90b 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -7,7 +7,7 @@
 #
 # When the minor or patch version of this is upgraded, you *must* update that
 # version constraint in pub to stay in sync with this.
-version: 0.14.0+2
+version: 0.14.1-dev
 
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
diff --git a/pkg/barback/test/package_graph/declaring_transformer_test.dart b/pkg/barback/test/package_graph/declaring_transformer_test.dart
index 9a8535f..88f2a83 100644
--- a/pkg/barback/test/package_graph/declaring_transformer_test.dart
+++ b/pkg/barback/test/package_graph/declaring_transformer_test.dart
@@ -303,7 +303,7 @@
 
   test("can emit outputs it didn't declare", () {
     initGraph(["app|foo.txt"], {"app": [
-      [new DeclareAssetsTransformer([], ["app|out.txt"])]
+      [new DeclareAssetsTransformer([], emitted: ["app|out.txt"])]
     ]});
 
     updateSources(["app|foo.txt"]);
@@ -316,7 +316,8 @@
 
   test("can overwrite the primary input even if it declared that it wouldn't",
       () {
-    var transformer = new DeclareAssetsTransformer([], ["app|foo.txt"]);
+    var transformer = new DeclareAssetsTransformer(
+        [], emitted: ["app|foo.txt"]);
     initGraph(["app|foo.txt"], {"app": [[transformer]]});
 
     transformer.pauseApply();
@@ -331,7 +332,7 @@
 
   test("can declare outputs it doesn't emit", () {
     initGraph(["app|foo.txt"], {"app": [
-      [new DeclareAssetsTransformer(["app|out.txt"], [])]
+      [new DeclareAssetsTransformer(["app|out.txt"], emitted: [])]
     ]});
 
     updateSources(["app|foo.txt"]);
diff --git a/pkg/barback/test/package_graph/errors_test.dart b/pkg/barback/test/package_graph/errors_test.dart
index 02a7675..1b578a5 100644
--- a/pkg/barback/test/package_graph/errors_test.dart
+++ b/pkg/barback/test/package_graph/errors_test.dart
@@ -145,6 +145,22 @@
     ]);
   });
 
+  test("a synchronous error loading an asset removes the asset from the graph",
+      () {
+    initGraph(["app|foo.txt"], {"app": [
+      // Have a dummy transformer so that barback at least tries to load the
+      // asset.
+      [new RewriteTransformer("a", "b")]
+    ]});
+
+    setAssetError("app|foo.txt", async: false);
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    buildShouldFail([
+      isAssetLoadException("app|foo.txt", isMockLoadException("app|foo.txt"))
+    ]);
+  });
+
   test("an asset isn't passed through a transformer with an error", () {
     initGraph(["app|foo.txt"], {"app": [[new BadTransformer([])]]});
 
diff --git a/pkg/barback/test/package_graph/transform/aggregate_test.dart b/pkg/barback/test/package_graph/transform/aggregate_test.dart
new file mode 100644
index 0000000..d6fb050
--- /dev/null
+++ b/pkg/barback/test/package_graph/transform/aggregate_test.dart
@@ -0,0 +1,326 @@
+// 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 barback.test.package_graph.transform.aggregate_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("an aggregate transformer can read from multiple primary inputs", () {
+    var sources = [
+      "app|dir/foo.txt",
+      "app|dir/bar.txt",
+      "app|dir/baz.jpg",
+      "app|dir/subdir/bang.txt",
+      "app|dir/subdir/qux.txt",
+      "app|dir/subdir/zap.png"
+    ];
+
+    initGraph(sources, {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources(sources);
+    expectAsset("app|dir/out.txt", "bar\nfoo");
+    expectAsset("app|dir/subdir/out.txt", "bang\nqux");
+    buildShouldSucceed();
+  });
+
+  test("an aggregate transformer isn't run if there are no primary inputs", () {
+    var transformer = new AggregateManyToOneTransformer("txt", "out.txt");
+    initGraph(["app|foo.zip", "app|bar.zap"], {"app": [
+      [transformer]
+    ]});
+
+    updateSources(["app|foo.zip", "app|bar.zap"]);
+    expectNoAsset("app|out.txt");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(0)));
+  });
+
+  test("an aggregate transformer is re-run if a primary input changes", () {
+    initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|bar.txt"]);
+    expectAsset("app|out.txt", "bar\nfoo");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "new foo");
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|out.txt", "bar\nnew foo");
+    buildShouldSucceed();
+  });
+
+  test("an aggregate transformer is re-run if a primary input is removed", () {
+    initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|bar.txt"]);
+    expectAsset("app|out.txt", "bar\nfoo");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.txt"]);
+    expectAsset("app|out.txt", "bar");
+    buildShouldSucceed();
+  });
+
+  test("an aggregate transformer is re-run if a primary input is added", () {
+    initGraph(["app|foo.txt", "app|bar.txt", "app|baz.txt"], {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|bar.txt"]);
+    expectAsset("app|out.txt", "bar\nfoo");
+    buildShouldSucceed();
+
+    updateSources(["app|baz.txt"]);
+    expectAsset("app|out.txt", "bar\nbaz\nfoo");
+    buildShouldSucceed();
+  });
+
+  test("an aggregate transformer ceases to run if all primary inputs are "
+      "removed", () {
+    initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|bar.txt"]);
+    expectAsset("app|out.txt", "bar\nfoo");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.txt", "app|bar.txt"]);
+    expectNoAsset("app|out.txt");
+    buildShouldSucceed();
+  });
+
+  test("an aggregate transformer starts to run if new primary inputs are "
+      "added", () {
+    initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources([]);
+    expectNoAsset("app|out.txt");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.txt", "app|bar.txt"]);
+    expectAsset("app|out.txt", "bar\nfoo");
+    buildShouldSucceed();
+  });
+
+  group("pass-through", () {
+    test("an aggregate transformer passes through its primary inputs by "
+        "default", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+        [new AggregateManyToOneTransformer("txt", "out.txt")]
+      ]});
+
+      updateSources(["app|foo.txt", "app|bar.txt"]);
+      expectAsset("app|foo.txt", "foo");
+      expectAsset("app|bar.txt", "bar");
+      buildShouldSucceed();
+
+      modifyAsset("app|foo.txt", "new foo");
+      updateSources(["app|foo.txt"]);
+      expectAsset("app|foo.txt", "new foo");
+      buildShouldSucceed();
+    });
+
+    test("an aggregate transformer can overwrite its primary inputs", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+        [new AggregateManyToManyTransformer("txt")]
+      ]});
+
+      updateSources(["app|foo.txt", "app|bar.txt"]);
+      expectAsset("app|foo.txt", "modified foo");
+      expectAsset("app|bar.txt", "modified bar");
+      buildShouldSucceed();
+    });
+
+    test("an aggregate transformer can consume its primary inputs", () {
+      var transformer = new AggregateManyToOneTransformer("txt", "out.txt");
+      transformer.consumePrimaries
+          ..add("app|foo.txt")
+          ..add("app|bar.txt");
+
+      initGraph(["app|foo.txt", "app|bar.txt"], {"app": [[transformer]]});
+
+      updateSources(["app|foo.txt", "app|bar.txt"]);
+      expectNoAsset("app|foo.txt");
+      expectNoAsset("app|bar.txt");
+      buildShouldSucceed();
+    });
+
+    test("an aggregate transformer passes through non-primary inputs", () {
+      initGraph(["app|foo.jpg", "app|bar.png"], {"app": [
+        [new AggregateManyToManyTransformer("txt")]
+      ]});
+
+      updateSources(["app|foo.jpg", "app|bar.png"]);
+      expectAsset("app|foo.jpg", "foo");
+      expectAsset("app|bar.png", "bar");
+      buildShouldSucceed();
+
+      modifyAsset("app|foo.jpg", "new foo");
+      updateSources(["app|foo.jpg"]);
+      expectAsset("app|foo.jpg", "new foo");
+      buildShouldSucceed();
+    });
+  });
+
+  group("apply() transform stream", () {
+    test("the primary input stream doesn't close if a previous phase is still "
+        "running", () {
+      var rewrite = new RewriteTransformer("a", "b");
+      initGraph(["app|foo.txt", "app|bar.a"], {"app": [
+        [rewrite],
+        [new AggregateManyToOneTransformer("txt", "out.txt")]
+      ]});
+
+      rewrite.pauseApply();
+      updateSources(["app|foo.txt", "app|bar.a"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      rewrite.resumeApply();
+      expectAsset("app|out.txt", "foo");
+      buildShouldSucceed();
+    });
+
+    test("the primary input stream doesn't close if a previous phase is "
+        "materializing a primary input", () {
+      var rewrite = new DeclaringRewriteTransformer("in", "txt");
+      initGraph(["app|foo.txt", "app|bar.in"], {"app": [
+        [rewrite],
+        [new AggregateManyToOneTransformer("txt", "out.txt")]
+      ]});
+
+      rewrite.pauseApply();
+      updateSources(["app|foo.txt", "app|bar.in"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      rewrite.resumeApply();
+      expectAsset("app|out.txt", "bar.txt\nfoo");
+      buildShouldSucceed();
+    });
+
+    test("the primary input stream closes if a previous phase is only "
+        "materializing non-primary inputs", () {
+      var rewrite = new DeclaringRewriteTransformer("a", "b");
+      initGraph(["app|foo.txt", "app|bar.a"], {"app": [
+        [rewrite],
+        [new AggregateManyToOneTransformer("txt", "out.txt")]
+      ]});
+
+      rewrite.pauseApply();
+      updateSources(["app|foo.txt", "app|bar.a"]);
+      expectAsset("app|out.txt", "foo");
+
+      rewrite.resumeApply();
+      buildShouldSucceed();
+    });
+
+    test("a new primary input that arrives before the stream closes doesn't "
+        "cause apply to restart", () {
+      var rewrite = new RewriteTransformer("a", "b");
+      var aggregate = new AggregateManyToOneTransformer("txt", "out.txt");
+      initGraph(["app|foo.txt", "app|bar.txt", "app|baz.a"], {"app": [
+        [rewrite],
+        [aggregate]
+      ]});
+
+      // The stream won't close until [rewrite] finishes running `apply()`.
+      rewrite.pauseApply();
+
+      updateSources(["app|foo.txt", "app|baz.a"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      updateSources(["app|bar.txt"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      rewrite.resumeApply();
+      expectAsset("app|out.txt", "bar\nfoo");
+      buildShouldSucceed();
+
+      expect(aggregate.numRuns, completion(equals(1)));
+    });
+
+    test("a new primary input that arrives after the stream closes causes "
+        "apply to restart", () {
+      var aggregate = new AggregateManyToOneTransformer("txt", "out.txt");
+      initGraph(["app|foo.txt", "app|bar.txt"], {"app": [[aggregate]]});
+
+      aggregate.pauseApply();
+      updateSources(["app|foo.txt"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      updateSources(["app|bar.txt"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      aggregate.resumeApply();
+      expectAsset("app|out.txt", "bar\nfoo");
+      buildShouldSucceed();
+
+      expect(aggregate.numRuns, completion(equals(2)));
+    });
+
+    test("a primary input that's modified before the stream closes causes "
+        "apply to restart", () {
+      var rewrite = new RewriteTransformer("a", "b");
+      var aggregate = new AggregateManyToOneTransformer("txt", "out.txt");
+      initGraph(["app|foo.txt", "app|bar.a"], {"app": [
+        [rewrite],
+        [aggregate]
+      ]});
+
+      // The stream won't close until [rewrite] finishes running `apply()`.
+      rewrite.pauseApply();
+
+      updateSources(["app|foo.txt", "app|bar.a"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      modifyAsset("app|foo.txt", "new foo");
+      updateSources(["app|foo.txt"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      rewrite.resumeApply();
+      expectAsset("app|out.txt", "new foo");
+      buildShouldSucceed();
+
+      expect(aggregate.numRuns, completion(equals(2)));
+    });
+
+    test("a primary input that's removed before the stream closes causes apply "
+        "to restart", () {
+      var rewrite = new RewriteTransformer("a", "b");
+      var aggregate = new AggregateManyToOneTransformer("txt", "out.txt");
+      initGraph(["app|foo.txt", "app|bar.txt", "app|baz.a"], {"app": [
+        [rewrite],
+        [aggregate]
+      ]});
+
+      // The stream won't close until [rewrite] finishes running `apply()`.
+      rewrite.pauseApply();
+
+      updateSources(["app|foo.txt", "app|bar.txt", "app|baz.a"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      removeSources(["app|bar.txt"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      rewrite.resumeApply();
+      expectAsset("app|out.txt", "foo");
+      buildShouldSucceed();
+
+      expect(aggregate.numRuns, completion(equals(2)));
+    });
+  });
+}
\ No newline at end of file
diff --git a/pkg/barback/test/package_graph/transform/concurrency_test.dart b/pkg/barback/test/package_graph/transform/concurrency_test.dart
index 5b0d2e9..f8927bb 100644
--- a/pkg/barback/test/package_graph/transform/concurrency_test.dart
+++ b/pkg/barback/test/package_graph/transform/concurrency_test.dart
@@ -539,4 +539,56 @@
     expect(transformer1.numRuns, completion(equals(2)));
     expect(transformer2.numRuns, completion(equals(2)));
   });
+
+  // Regression test for issue 19038.
+  test("a secondary input that's marked dirty followed by the primary input "
+      "being synchronously marked dirty re-runs a transformer", () {
+    // Issue 19038 was caused by the following sequence of events:
+    //
+    // * Several inputs are marked dirty at once, causing dirty events to
+    //   propagate synchronously throughout the transform graph.
+    //
+    // * A transform (ManyToOneTransformer in this test case) has a secondary
+    //   input ("one.in") and a primary input ("foo.txt") that will both be
+    //   marked dirty.
+    //
+    // * The secondary input is marked dirty before the primary input. This
+    //   causes the transform to start running `apply`. Since as far as it knows
+    //   its primary input is still available, it passes that input to `apply`.
+    //
+    // * Now the primary input is marked dirty. The transform node checks to see
+    //   if this primary input has already been added to the transform
+    //   controller. This is where the bug existed: the answer to this was
+    //   incorrectly "no" until after some asynchronous processing occurred.
+    //
+    // * Since the transform thought the primary input hadn't yet been passed to
+    //   the transform controller, it didn't bother restarting the transform,
+    //   causing the old output to be preserved incorrectly.
+    initGraph({
+      "app|foo.txt": "one",
+      "app|one.in": "1",
+      "app|two.in": "2"
+    }, {"app": [
+      // We need to use CheckContentTransformer here so that
+      // ManyToOneTransformer reads its primary input from memory rather than
+      // from the filesystem. If it read from the filesystem, it might
+      // accidentally get the correct output despite accessing the incorrect
+      // asset, which would cause false positives for the test.
+      [new CheckContentTransformer(new RegExp("one|two"), ".in")],
+      [new ManyToOneTransformer("txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|one.in", "app|two.in"]);
+    expectAsset("app|foo.out", "1");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "two");
+
+    // It's important that "one.in" come first in this list, since
+    // ManyToOneTransformer needs to see its secondary input change first.
+    updateSources(["app|one.in", "app|foo.txt"]);
+
+    expectAsset("app|foo.out", "2");
+    buildShouldSucceed();
+  });
 }
diff --git a/pkg/barback/test/package_graph/transform/declaring_aggregate_test.dart b/pkg/barback/test/package_graph/transform/declaring_aggregate_test.dart
new file mode 100644
index 0000000..3465f26
--- /dev/null
+++ b/pkg/barback/test/package_graph/transform/declaring_aggregate_test.dart
@@ -0,0 +1,251 @@
+// 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 barback.test.package_graph.transform.declaring_aggregate_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  group("a declaring aggregate transformer", () {
+    test("is eager by default", () {
+      var transformer = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.txt"], {"app": [[transformer]]});
+
+      updateSources(["app|foo.txt"]);
+      buildShouldSucceed();
+
+      expect(transformer.numRuns, completion(equals(1)));
+    });
+
+    test("is deferred if any primary input is deferred", () {
+      var rewrite = new LazyRewriteTransformer("in", "txt");
+      var aggregate = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [rewrite]
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.txt", "app|baz.txt"]);
+      buildShouldSucceed();
+
+      // Add [aggregate] to the graph after a build has been completed so that
+      // all its inputs are available immediately. Otherwise it could start
+      // applying eagerly before receiving its lazy input.
+      updateTransformers("app", [[rewrite], [aggregate]]);
+      buildShouldSucceed();
+      expect(aggregate.numRuns, completion(equals(0)));
+
+      expectAsset("app|out.txt", "bar\nbaz\nfoo.txt");
+      buildShouldSucceed();
+      expect(aggregate.numRuns, completion(equals(1)));
+    });
+
+    test("switches from eager to deferred if a deferred primary input is added",
+        () {
+      var transformer = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [new LazyRewriteTransformer("in", "txt")],
+        [transformer]
+      ]});
+
+      updateSources(["app|bar.txt", "app|baz.txt"]);
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(1)));
+
+      updateSources(["app|foo.in"]);
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(1)));
+
+      expectAsset("app|out.txt", "bar\nbaz\nfoo.txt");
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(2)));
+    });
+
+    test("switches from deferred to eager if its last deferred primary input "
+        "is removed", () {
+      var rewrite = new LazyRewriteTransformer("in", "txt");
+      var aggregate = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [rewrite]
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.txt", "app|baz.txt"]);
+      buildShouldSucceed();
+
+      // Add [aggregate] to the graph after a build has been completed so that
+      // all its inputs are available immediately. Otherwise it could start
+      // applying eagerly before receiving its lazy input.
+      updateTransformers("app", [[rewrite], [aggregate]]);
+      buildShouldSucceed();
+      expect(aggregate.numRuns, completion(equals(0)));
+
+      removeSources(["app|foo.in"]);
+      buildShouldSucceed();
+      expect(aggregate.numRuns, completion(equals(1)));
+    });
+
+    test("begins running eagerly when all its deferred primary inputs become "
+        "available", () {
+      var lazyPhase = [
+        new LazyAssetsTransformer(["app|foo.txt", "app|foo.x"],
+            input: "app|foo.in"),
+        new LazyAssetsTransformer(["app|bar.txt", "app|bar.x"],
+            input: "app|bar.in")
+      ];
+      var transformer = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.in", "app|bar.in", "app|baz.txt"], {"app": [
+        lazyPhase,
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.in", "app|baz.txt"]);
+      buildShouldSucceed();
+
+      // Add [transformer] to the graph after a build has been completed so that
+      // all its inputs are available immediately. Otherwise it could start
+      // applying eagerly before receiving its lazy inputs.
+      updateTransformers("app", [lazyPhase, [transformer]]);
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(0)));
+
+      // Now "app|foo.txt" will be available, but "app|bar.txt" won't, so the
+      // [transformer] shouldn't run.
+      expectAsset("app|foo.x", "app|foo.x");
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(0)));
+
+      // Now "app|foo.txt" and "app|bar.txt" will both be available, so the
+      // [transformer] should run.
+      expectAsset("app|bar.x", "app|bar.x");
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(1)));
+    });
+
+    test("stops running eagerly when any of its deferred primary inputs become "
+        "unavailable", () {
+      var lazyPhase = [
+        new LazyAssetsTransformer(["app|foo.txt", "app|foo.x"],
+            input: "app|foo.in"),
+        new LazyAssetsTransformer(["app|bar.txt", "app|bar.x"],
+            input: "app|bar.in")
+      ];
+      var transformer = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.in", "app|bar.in", "app|baz.txt"], {"app": [
+        lazyPhase
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.in", "app|baz.txt"]);
+      expectAsset("app|foo.x", "app|foo.x");
+      expectAsset("app|bar.x", "app|bar.x");
+      buildShouldSucceed();
+
+      // Add [transformer] to the graph after a build has been completed so that
+      // all its inputs are available immediately. Otherwise it could start
+      // applying eagerly before receiving its lazy inputs.
+      updateTransformers("app", [lazyPhase, [transformer]]);
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(1)));
+
+      // Now "app|foo.txt" is unavailable, so the [transformer] shouldn't run.
+      updateSources(["app|foo.in"]);
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(1)));
+    });
+
+    test("re-declares its outputs for a new primary input", () {
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [new LazyRewriteTransformer("in", "txt")],
+        [new DeclaringAggregateManyToManyTransformer("txt")]
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.txt"]);
+      buildShouldSucceed();
+
+      updateSources(["app|baz.txt"]);
+      buildShouldSucceed();
+
+      // If the aggregate transformer didn't re-declare its outputs upon getting
+      // a new primary input, getting "baz.txt" wouldn't trigger an apply and
+      // would just return the unmodified baz.
+      expectAsset("app|baz.txt", "modified baz");
+    });
+
+    test("re-declares its outputs for a new primary input received while "
+        "applying", () {
+      var transformer = new DeclaringAggregateManyToManyTransformer("txt");
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [new LazyRewriteTransformer("in", "txt")],
+        [transformer]
+      ]});
+
+      transformer.pauseApply();
+      updateSources(["app|foo.in", "app|bar.txt"]);
+
+      // Ensure we're waiting on `apply()`.
+      schedule(pumpEventQueue);
+
+      updateSources(["app|baz.txt"]);
+      transformer.resumeApply();
+      buildShouldSucceed();
+
+      expectAsset("app|baz.txt", "modified baz");
+    });
+
+    test("re-declares its outputs for a new primary input received while "
+        "applying after a primary input was modified", () {
+      var transformer = new DeclaringAggregateManyToManyTransformer("txt");
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [new LazyRewriteTransformer("in", "txt")],
+        [transformer]
+      ]});
+
+      transformer.pauseApply();
+      updateSources(["app|foo.in", "app|bar.txt"]);
+
+      // Ensure we're waiting on `apply()`.
+      schedule(pumpEventQueue);
+
+      updateSources(["app|bar.txt"]);
+
+      // Make sure the change to "bar.txt" is fully processed.
+      schedule(pumpEventQueue);
+
+      updateSources(["app|baz.txt"]);
+      transformer.resumeApply();
+      buildShouldSucceed();
+
+      expectAsset("app|baz.txt", "modified baz");
+    });
+  });
+
+  group("a lazy aggregate transformer", () {
+    test("doesn't run eagerly", () {
+      var transformer = new LazyAggregateManyToOneTransformer("txt", "out.txt");
+      initGraph(["app|foo.txt"], {"app": [[transformer]]});
+
+      updateSources(["app|foo.txt"]);
+      buildShouldSucceed();
+
+      expect(transformer.numRuns, completion(equals(0)));
+    });
+
+    test("runs when an output is requested", () {
+      initGraph(["app|foo.txt"], {"app": [[
+        new LazyAggregateManyToOneTransformer("txt", "out.txt")
+      ]]});
+
+      updateSources(["app|foo.txt"]);
+      buildShouldSucceed();
+      expectAsset("app|out.txt", "foo");
+    });
+  });
+}
diff --git a/pkg/barback/test/transformer/aggregate_many_to_many.dart b/pkg/barback/test/transformer/aggregate_many_to_many.dart
new file mode 100644
index 0000000..6e3c8a1
--- /dev/null
+++ b/pkg/barback/test/transformer/aggregate_many_to_many.dart
@@ -0,0 +1,37 @@
+// 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 barback.test.transformer.aggregate_many_to_many;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+
+import 'mock_aggregate.dart';
+
+/// An [AggregateTransformer] that takes all assets with a given extension,
+/// grouped by directory, adds to their contents.
+class AggregateManyToManyTransformer extends MockAggregateTransformer {
+  /// The extension of assets to combine.
+  final String extension;
+
+  AggregateManyToManyTransformer(this.extension);
+
+  String doClassifyPrimary(AssetId id) {
+    if (id.extension != ".$extension") return null;
+    return path.url.dirname(id.path);
+  }
+
+  Future doApply(AggregateTransform transform) {
+    return getPrimaryInputs(transform).asyncMap((asset) {
+      return asset.readAsString().then((contents) {
+        transform.addOutput(new Asset.fromString(
+            asset.id, "modified $contents"));
+      });
+    }).toList();
+  }
+
+  String toString() => "aggregate $extension->many";
+}
diff --git a/pkg/barback/test/transformer/aggregate_many_to_one.dart b/pkg/barback/test/transformer/aggregate_many_to_one.dart
new file mode 100644
index 0000000..7bba89f
--- /dev/null
+++ b/pkg/barback/test/transformer/aggregate_many_to_one.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.
+
+library barback.test.transformer.aggregate_many_to_one;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+
+import 'mock_aggregate.dart';
+
+/// An [AggregateTransformer] that applies to all assets with a given extension.
+/// For each directory containing any of these assets, it produces an output
+/// file that contains the concatenation of all matched assets in that
+/// directory in alphabetic order by name.
+class AggregateManyToOneTransformer extends MockAggregateTransformer {
+  /// The extension of assets to combine.
+  final String extension;
+
+  /// The basename of the output asset.
+  ///
+  /// The output asset's path will contain the directory name of the inputs as
+  /// well.
+  final String output;
+
+  AggregateManyToOneTransformer(this.extension, this.output);
+
+  String doClassifyPrimary(AssetId id) {
+    if (id.extension != ".$extension") return null;
+    return path.url.dirname(id.path);
+  }
+
+  Future doApply(AggregateTransform transform) {
+    return getPrimaryInputs(transform).toList().then((assets) {
+      assets.sort((asset1, asset2) => asset1.id.path.compareTo(asset2.id.path));
+      return Future.wait(assets.map((asset) => asset.readAsString()));
+    }).then((contents) {
+      var id = new AssetId(transform.package,
+          path.url.join(transform.key, output));
+      transform.addOutput(new Asset.fromString(id, contents.join('\n')));
+    });
+  }
+
+  String toString() => "aggregate $extension->$output";
+}
diff --git a/pkg/barback/test/transformer/declare_assets.dart b/pkg/barback/test/transformer/declare_assets.dart
index 4cf5370..03418ed 100644
--- a/pkg/barback/test/transformer/declare_assets.dart
+++ b/pkg/barback/test/transformer/declare_assets.dart
@@ -19,12 +19,17 @@
   /// These assets' contents will be identical to their ids.
   final List<AssetId> emitted;
 
-  DeclareAssetsTransformer(Iterable<String> declared, [Iterable<String> emitted])
+  /// If this is non-`null`, assets are only declared for this input.
+  final AssetId input;
+
+  DeclareAssetsTransformer(Iterable<String> declared, {Iterable<String> emitted,
+        String input})
       : this.declared = declared.map((id) => new AssetId.parse(id)).toList(),
         this.emitted = (emitted == null ? declared : emitted)
-            .map((id) => new AssetId.parse(id)).toList();
+            .map((id) => new AssetId.parse(id)).toList(),
+        this.input = input == null ? null : new AssetId.parse(input);
 
-  bool doIsPrimary(AssetId id) => true;
+  bool doIsPrimary(AssetId id) => input == null || id == input;
 
   void doApply(Transform transform) {
     for (var id in emitted) {
diff --git a/pkg/barback/test/transformer/declaring_aggregate_many_to_many.dart b/pkg/barback/test/transformer/declaring_aggregate_many_to_many.dart
new file mode 100644
index 0000000..2377345
--- /dev/null
+++ b/pkg/barback/test/transformer/declaring_aggregate_many_to_many.dart
@@ -0,0 +1,23 @@
+// 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 barback.test.transformer.declaring_aggregate_many_to_many;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'aggregate_many_to_many.dart';
+
+/// Like [AggregateManyToManyTransformer], but declares its assets ahead of
+/// time.
+class DeclaringAggregateManyToManyTransformer
+    extends AggregateManyToManyTransformer
+    implements DeclaringAggregateTransformer {
+  DeclaringAggregateManyToManyTransformer(String extension)
+      : super(extension);
+
+  Future declareOutputs(DeclaringAggregateTransform transform) =>
+      transform.primaryIds.asyncMap(transform.declareOutput).toList();
+}
diff --git a/pkg/barback/test/transformer/declaring_aggregate_many_to_one.dart b/pkg/barback/test/transformer/declaring_aggregate_many_to_one.dart
new file mode 100644
index 0000000..7f18741
--- /dev/null
+++ b/pkg/barback/test/transformer/declaring_aggregate_many_to_one.dart
@@ -0,0 +1,23 @@
+// 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 barback.test.transformer.declaring_aggregate_many_to_one;
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+
+import 'aggregate_many_to_one.dart';
+
+/// Like [AggregateManyToOneTransformer], but declares its assets ahead of time.
+class DeclaringAggregateManyToOneTransformer
+    extends AggregateManyToOneTransformer
+    implements DeclaringAggregateTransformer {
+  DeclaringAggregateManyToOneTransformer(String extension, String output)
+      : super(extension, output);
+
+  void declareOutputs(DeclaringAggregateTransform transform) {
+    transform.declareOutput(new AssetId(transform.package,
+        path.url.join(transform.key, output)));
+  }
+}
diff --git a/pkg/barback/test/transformer/lazy_aggregate_many_to_many.dart b/pkg/barback/test/transformer/lazy_aggregate_many_to_many.dart
new file mode 100644
index 0000000..6c010a4
--- /dev/null
+++ b/pkg/barback/test/transformer/lazy_aggregate_many_to_many.dart
@@ -0,0 +1,18 @@
+// 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 barback.test.transformer.lazy_aggregate_many_to_many;
+
+import 'package:barback/barback.dart';
+
+import 'declaring_aggregate_many_to_many.dart';
+
+/// An [AggregateTransformer] that takes all assets in each directory with a
+/// given extension and adds to their contents.
+class LazyAggregateManyToManyTransformer
+    extends DeclaringAggregateManyToManyTransformer
+    implements LazyAggregateTransformer {
+  LazyAggregateManyToManyTransformer(String extension)
+      : super(extension);
+}
diff --git a/pkg/barback/test/transformer/lazy_aggregate_many_to_one.dart b/pkg/barback/test/transformer/lazy_aggregate_many_to_one.dart
new file mode 100644
index 0000000..6bd2519
--- /dev/null
+++ b/pkg/barback/test/transformer/lazy_aggregate_many_to_one.dart
@@ -0,0 +1,18 @@
+// 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 barback.test.transformer.lazy_aggregate_many_to_one;
+
+import 'package:barback/barback.dart';
+
+import 'declaring_aggregate_many_to_one.dart';
+
+/// Like [AggregateManyToOneTransformer], but returns a lazy asset that doesn't
+/// perform the rewrite until it's materialized.
+class LazyAggregateManyToOneTransformer
+    extends DeclaringAggregateManyToOneTransformer
+    implements LazyAggregateTransformer {
+  LazyAggregateManyToOneTransformer(String extension, String output)
+      : super(extension, output);
+}
diff --git a/pkg/barback/test/transformer/lazy_assets.dart b/pkg/barback/test/transformer/lazy_assets.dart
index 2a5a683..5fa81d0 100644
--- a/pkg/barback/test/transformer/lazy_assets.dart
+++ b/pkg/barback/test/transformer/lazy_assets.dart
@@ -11,6 +11,7 @@
 /// Like [DeclareAssetsTransformer], but lazy.
 class LazyAssetsTransformer extends DeclareAssetsTransformer
     implements LazyTransformer {
-  LazyAssetsTransformer(Iterable<String> declared, [Iterable<String> emitted])
-      : super(declared, emitted);
+  LazyAssetsTransformer(Iterable<String> declared, {Iterable<String> emitted,
+        String input})
+      : super(declared, emitted: emitted, input: input);
 }
diff --git a/pkg/barback/test/transformer/mock.dart b/pkg/barback/test/transformer/mock.dart
index 8b0f5e2..143496b 100644
--- a/pkg/barback/test/transformer/mock.dart
+++ b/pkg/barback/test/transformer/mock.dart
@@ -30,7 +30,8 @@
   /// The number of currently running transforms.
   int _runningTransforms = 0;
 
-  /// A completer for pausing the transformer before it finishes running [apply].
+  /// A completer for pausing the transformer before it finishes running
+  /// [apply].
   Completer _apply;
 
   /// Completers for pausing the transformer before it finishes running
diff --git a/pkg/barback/test/transformer/mock_aggregate.dart b/pkg/barback/test/transformer/mock_aggregate.dart
new file mode 100644
index 0000000..7f47b53
--- /dev/null
+++ b/pkg/barback/test/transformer/mock_aggregate.dart
@@ -0,0 +1,208 @@
+// 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 barback.test.transformer.mock_aggregate;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+/// The abstract base class for aggregate transformers used to test barback.
+///
+/// This adds the ability to pause and resume different components of the
+/// transformers, and to tell whether they're running, when they start running,
+/// and how many times they've run.
+///
+/// Transformers extending this should override [doClassifyPrimary] and
+/// [doApply] rather than [classifyPrimary] and [apply], and they should use
+/// [getInput] and [getPrimaryInputs] rather than [transform.getInput] and
+/// [transform.primaryInputs].
+abstract class MockAggregateTransformer extends AggregateTransformer {
+  /// The number of times the transformer has been applied.
+  ///
+  /// This is scheduled. The Future will complete at the point in the schedule
+  /// that this is called.
+  Future<int> get numRuns => schedule(() => _numRuns);
+  var _numRuns = 0;
+
+  /// The number of currently running transforms.
+  int _runningTransforms = 0;
+
+  /// A completer for pausing the transformer before it finishes running
+  /// [apply].
+  Completer _apply;
+
+  /// Completers for pausing the transformer before it finishes running
+  /// [classifyPrimary].
+  final _classifyPrimary = new Map<AssetId, Completer>();
+
+  /// Completers for pausing the transformer before it finishes getting inputs
+  /// the [Transform].
+  final _getInput = new Map<AssetId, Completer>();
+
+  /// Completer for pausing the transformer before it accesses
+  /// [getPrimaryInputs].
+  Completer _primaryInputs;
+
+  /// A completer that completes once this transformer begins running.
+  ///
+  /// Once this transformer finishes running, this is reset to a new completer,
+  /// so it can be used multiple times.
+  var _started = new Completer();
+
+  /// `true` if any transforms are currently running.
+  ///
+  /// This is scheduled. The Future will complete at the point in the schedule
+  /// that this is called.
+  Future<bool> get isRunning => schedule(() => _runningTransforms > 0);
+
+  /// All elements of this set will be automatically consumed during [apply].
+  final consumePrimaries = new Set<String>();
+
+  /// Pauses the schedule until this transformer begins running.
+  void waitUntilStarted() {
+    schedule(() => _started.future, "wait until $this starts");
+  }
+
+  /// Causes the transformer to pause after running [apply] but before the
+  /// returned Future completes.
+  ///
+  /// This can be resumed by calling [resumeApply]. This operation is scheduled.
+  void pauseApply() {
+    schedule(() {
+      _apply = new Completer();
+    }, "pause apply for $this");
+  }
+
+  /// Resumes the transformer's [apply] call after [pauseApply] was called.
+  ///
+  /// This operation is scheduled.
+  void resumeApply() {
+    schedule(() {
+      _apply.complete();
+      _apply = null;
+    }, "resume apply for $this");
+  }
+
+  /// Causes the transformer to pause after running [classifyPrimary] on the
+  /// asset with the given [name], but before the returned Future completes.
+  ///
+  /// This can be resumed by calling [resumeClassifyPrimary]. This operation is
+  /// scheduled.
+  void pauseClassifyPrimary(String name) {
+    schedule(() {
+      _classifyPrimary[new AssetId.parse(name)] = new Completer();
+    }, "pause classifyPrimary($name) for $this");
+  }
+
+  /// Resumes the transformer's [classifyPrimary] call on the asset with the
+  /// given [name] after [pauseClassifyPrimary] was called.
+  ///
+  /// This operation is scheduled.
+  void resumeClassifyPrimary(String name) {
+    schedule(() {
+      _classifyPrimary.remove(new AssetId.parse(name)).complete();
+    }, "resume classifyPrimary($name) for $this");
+  }
+
+  /// Causes the transformer to pause while loading the secondary input with
+  /// the given [name].
+  ///
+  /// This can be resumed by calling [resumeGetInput]. This operation is
+  /// scheduled.
+  void pauseGetInput(String name) {
+    schedule(() {
+      _getInput[new AssetId.parse(name)] = new Completer();
+    }, "pause getInput($name) for $this");
+  }
+
+  /// Resumes the transformer's loading of the input with the given [name] after
+  /// [pauseGetInput] was called.
+  ///
+  /// This operation is scheduled.
+  void resumeGetInput(String name) {
+    schedule(() {
+      _getInput.remove(new AssetId.parse(name)).complete();
+    }, "resume getInput($name) for $this");
+  }
+
+  /// Causes the transformer to pause before accessing [getPrimaryInputs].
+  ///
+  /// This can be resumed by calling [resumePrimaryInputs]. This operation is
+  /// scheduled.
+  void pausePrimaryInputs() {
+    schedule(() {
+      _primaryInputs = new Completer();
+    }, "pause primaryInputs for $this");
+  }
+
+  /// Resumes the transformer's invocation of [primaryInputs] after
+  /// [pausePrimaryInputs] was called.
+  ///
+  /// This operation is scheduled.
+  void resumePrimaryInputs() {
+    schedule(() {
+      _primaryInputs.complete();
+      _primaryInputs = null;
+    }, "resume primaryInputs for $this");
+  }
+
+  /// Like [AggregateTransform.getInput], but respects [pauseGetInput].
+  ///
+  /// This is intended for use by subclasses of [MockAggregateTransformer].
+  Future<Asset> getInput(AggregateTransform transform, AssetId id) {
+    return newFuture(() {
+      if (_getInput.containsKey(id)) return _getInput[id].future;
+    }).then((_) => transform.getInput(id));
+  }
+
+  /// Like [AggregateTransform.primaryInputs], but respects
+  /// [pausePrimaryInputs].
+  ///
+  /// This is intended for use by subclasses of [MockAggregateTransformer].
+  Stream<Asset> getPrimaryInputs(AggregateTransform transform) {
+    return futureStream(newFuture(() {
+      if (_primaryInputs != null) return _primaryInputs.future;
+    }).then((_) => transform.primaryInputs));
+  }
+
+  Future<String> classifyPrimary(AssetId id) {
+    return newFuture(() => doClassifyPrimary(id)).then((result) {
+      return newFuture(() {
+        if (_classifyPrimary.containsKey(id)) {
+          return _classifyPrimary[id].future;
+        }
+      }).then((_) => result);
+    });
+  }
+
+  Future apply(AggregateTransform transform) {
+    _numRuns++;
+    if (_runningTransforms == 0) _started.complete();
+    _runningTransforms++;
+    return newFuture(() => doApply(transform)).then((_) {
+      if (_apply != null) return _apply.future;
+    }).whenComplete(() {
+      for (var id in consumePrimaries) {
+        transform.consumePrimary(new AssetId.parse(id));
+      }
+      _runningTransforms--;
+      if (_runningTransforms == 0) _started = new Completer();
+    });
+  }
+
+  /// The wrapped version of [classifyPrimary] for subclasses to override.
+  ///
+  /// This may return a `Future<String>` or, if it's entirely synchronous, a
+  /// `String`.
+  doClassifyPrimary(AssetId id);
+
+  /// The wrapped version of [doApply] for subclasses to override.
+  ///
+  /// If this does asynchronous work, it should return a [Future] that completes
+  /// once it's finished.
+  doApply(AggregateTransform transform);
+}
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index 4fa3d3f..2ab3abc 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -15,6 +15,8 @@
 import 'package:stack_trace/stack_trace.dart';
 import 'package:unittest/compact_vm_config.dart';
 
+export 'transformer/aggregate_many_to_many.dart';
+export 'transformer/aggregate_many_to_one.dart';
 export 'transformer/bad.dart';
 export 'transformer/bad_log.dart';
 export 'transformer/catch_asset_not_found.dart';
@@ -23,11 +25,15 @@
 export 'transformer/conditionally_consume_primary.dart';
 export 'transformer/create_asset.dart';
 export 'transformer/declare_assets.dart';
+export 'transformer/declaring_aggregate_many_to_many.dart';
+export 'transformer/declaring_aggregate_many_to_one.dart';
 export 'transformer/declaring_bad.dart';
 export 'transformer/declaring_check_content_and_rename.dart';
 export 'transformer/declaring_rewrite.dart';
 export 'transformer/emit_nothing.dart';
 export 'transformer/has_input.dart';
+export 'transformer/lazy_aggregate_many_to_many.dart';
+export 'transformer/lazy_aggregate_many_to_one.dart';
 export 'transformer/lazy_assets.dart';
 export 'transformer/lazy_bad.dart';
 export 'transformer/lazy_check_content_and_rename.dart';
@@ -35,6 +41,7 @@
 export 'transformer/lazy_rewrite.dart';
 export 'transformer/many_to_one.dart';
 export 'transformer/mock.dart';
+export 'transformer/mock_aggregate.dart';
 export 'transformer/one_to_many.dart';
 export 'transformer/rewrite.dart';
 export 'transformer/sync_rewrite.dart';
@@ -158,10 +165,11 @@
 /// Schedules an error to be generated when loading the asset identified by
 /// [name].
 ///
-/// Does not update the asset in the graph.
-void setAssetError(String name) {
+/// Does not update the asset in the graph. If [async] is true, the error is
+/// thrown asynchronously.
+void setAssetError(String name, {bool async: true}) {
   schedule(() {
-    _provider._setAssetError(name);
+    _provider._setAssetError(name, async);
   }, "set error for asset $name");
 }
 
@@ -470,6 +478,10 @@
   /// they're loaded.
   final _errors = new Set<AssetId>();
 
+  /// The set of assets for which synchronous [MockLoadException]s should be
+  /// emitted if they're loaded.
+  final _syncErrors = new Set<AssetId>();
+
   /// The completer that [getAsset()] is waiting on to complete when paused.
   ///
   /// If `null` it will return the asset immediately.
@@ -527,11 +539,12 @@
   void _modifyAsset(String name, String contents) {
     var id = new AssetId.parse(name);
     _errors.remove(id);
+    _syncErrors.remove(id);
     (_assets[id.package][id] as _MockAsset).contents = contents;
   }
 
-  void _setAssetError(String name) {
-    _errors.add(new AssetId.parse(name));
+  void _setAssetError(String name, bool async) {
+    (async ? _errors : _syncErrors).add(new AssetId.parse(name));
   }
 
   List<AssetId> listAssets(String package, {String within}) {
@@ -549,6 +562,7 @@
     var asset;
     if (assets != null) asset = assets[id];
 
+    if (_syncErrors.contains(id)) throw new MockLoadException(id);
     var hasError = _errors.contains(id);
 
     var future;
diff --git a/pkg/collection/CHANGELOG.md b/pkg/collection/CHANGELOG.md
index e5a6381..6c1c554 100644
--- a/pkg/collection/CHANGELOG.md
+++ b/pkg/collection/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.9.3+1
+
+* Fix all analyzer hints.
+
 ## 0.9.3
 
 * Add a `MapKeySet` class that exposes an unmodifiable `Set` view of a `Map`'s
diff --git a/pkg/collection/lib/src/unmodifiable_wrappers.dart b/pkg/collection/lib/src/unmodifiable_wrappers.dart
index 022bbfe..72b189c 100644
--- a/pkg/collection/lib/src/unmodifiable_wrappers.dart
+++ b/pkg/collection/lib/src/unmodifiable_wrappers.dart
@@ -36,7 +36,7 @@
  * change the List's length.
  */
 abstract class NonGrowableListMixin<E> implements List<E> {
-  static void _throw() {
+  static _throw() {
     throw new UnsupportedError(
         "Cannot change the length of a fixed-length list");
   }
@@ -51,9 +51,7 @@
    * Throws an [UnsupportedError];
    * operations that change the length of the list are disallowed.
    */
-  bool add(E value) {
-    _throw();
-  }
+  bool add(E value) => _throw();
 
   /**
    * Throws an [UnsupportedError];
@@ -77,19 +75,19 @@
    * Throws an [UnsupportedError];
    * operations that change the length of the list are disallowed.
    */
-  bool remove(Object value) { _throw(); }
+  bool remove(Object value) => _throw();
 
   /**
    * Throws an [UnsupportedError];
    * operations that change the length of the list are disallowed.
    */
-  E removeAt(int index) { _throw(); }
+  E removeAt(int index) => _throw();
 
   /**
    * Throws an [UnsupportedError];
    * operations that change the length of the list are disallowed.
    */
-  E removeLast() { _throw(); }
+  E removeLast() => _throw();
 
   /**
    * Throws an [UnsupportedError];
@@ -141,7 +139,7 @@
  * change the Set.
  */
 abstract class UnmodifiableSetMixin<E> implements Set<E> {
-  void _throw() {
+  _throw() {
     throw new UnsupportedError("Cannot modify an unmodifiable Set");
   }
 
@@ -149,9 +147,7 @@
    * Throws an [UnsupportedError];
    * operations that change the set are disallowed.
    */
-  bool add(E value) {
-    _throw();
-  }
+  bool add(E value) => _throw();
 
   /**
    * Throws an [UnsupportedError];
@@ -163,7 +159,7 @@
    * Throws an [UnsupportedError];
    * operations that change the set are disallowed.
    */
-  bool remove(Object value) { _throw(); }
+  bool remove(Object value) => _throw();
 
   /**
    * Throws an [UnsupportedError];
@@ -215,7 +211,7 @@
  * change the Map.
  */
 abstract class UnmodifiableMapMixin<K, V> implements Map<K, V> {
-  static void _throw() {
+  static _throw() {
     throw new UnsupportedError("Cannot modify an unmodifiable Map");
   }
 
@@ -229,7 +225,7 @@
    * Throws an [UnsupportedError];
    * operations that change the map are disallowed.
    */
-  V putIfAbsent(K key, V ifAbsent()) { _throw(); }
+  V putIfAbsent(K key, V ifAbsent()) => _throw();
 
   /**
    * Throws an [UnsupportedError];
@@ -241,7 +237,7 @@
    * Throws an [UnsupportedError];
    * operations that change the map are disallowed.
    */
-  V remove(K key) { _throw(); }
+  V remove(K key) => _throw();
 
   /**
    * Throws an [UnsupportedError];
diff --git a/pkg/collection/pubspec.yaml b/pkg/collection/pubspec.yaml
index e0d1097..80b0972 100644
--- a/pkg/collection/pubspec.yaml
+++ b/pkg/collection/pubspec.yaml
@@ -1,5 +1,5 @@
 name: collection
-version: 0.9.3
+version: 0.9.3+1
 author: Dart Team <misc@dartlang.org>
 description: Collections and utilities functions and classes related to collections.
 homepage: http://www.dartlang.org
diff --git a/pkg/csslib/lib/src/messages.dart b/pkg/csslib/lib/src/messages.dart
index 24964ad..6c2ecbf 100644
--- a/pkg/csslib/lib/src/messages.dart
+++ b/pkg/csslib/lib/src/messages.dart
@@ -60,6 +60,7 @@
     if (span == null) {
       output.write(message);
     } else {
+      output.write('on ');
       output.write(span.getLocationMessage(message, useColors: colors,
           color: levelColor));
     }
diff --git a/pkg/csslib/pubspec.yaml b/pkg/csslib/pubspec.yaml
index 66240e7..09d60e4 100644
--- a/pkg/csslib/pubspec.yaml
+++ b/pkg/csslib/pubspec.yaml
@@ -1,5 +1,5 @@
 name: csslib
-version: 0.10.0
+version: 0.10.0+1
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: A library for parsing CSS.
 homepage: https://www.dartlang.org
@@ -9,7 +9,7 @@
   args: '>=0.9.0 <0.12.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
-  source_maps: '>=0.9.0 <0.10.0'
+  source_maps: '>=0.9.1 <0.10.0'
 dev_dependencies:
   browser: '>=0.9.0 <0.10.0'
   unittest: '>=0.9.0 <0.10.0'
diff --git a/pkg/csslib/test/error_test.dart b/pkg/csslib/test/error_test.dart
index 935c618..f48906c 100644
--- a/pkg/csslib/test/error_test.dart
+++ b/pkg/csslib/test/error_test.dart
@@ -21,7 +21,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:24: Unknown property value bolder
+error on line 1, column 24: Unknown property value bolder
 .foobar { font-weight: bolder; }
                        ^^^^^^''');
   expect(stylesheet != null, true);
@@ -38,7 +38,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:24: Unknown property value lighter
+error on line 1, column 24: Unknown property value lighter
 .foobar { font-weight: lighter; }
                        ^^^^^^^''');
   expect(stylesheet != null, true);
@@ -54,7 +54,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:24: Unknown property value inherit
+error on line 1, column 24: Unknown property value inherit
 .foobar { font-weight: inherit; }
                        ^^^^^^^''');
   expect(stylesheet != null, true);
@@ -77,7 +77,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:24: Unexpected value for line-height
+error on line 1, column 24: Unexpected value for line-height
 .foobar { line-height: 120%; }
                        ^^^''');
   expect(stylesheet != null, true);
@@ -93,7 +93,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:24: Unexpected unit for line-height
+error on line 1, column 24: Unexpected unit for line-height
 .foobar { line-height: 20cm; }
                        ^^''');
   expect(stylesheet != null, true);
@@ -109,7 +109,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:24: Unknown property value inherit
+error on line 1, column 24: Unknown property value inherit
 .foobar { line-height: inherit; }
                        ^^^^^^^''');
   expect(stylesheet != null, true);
@@ -129,7 +129,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:1: Not a valid ID selector expected #id
+error on line 1, column 1: Not a valid ID selector expected #id
 # foo { color: #ff00ff; }
 ^''');
   expect(stylesheet != null, true);
@@ -144,7 +144,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:1: Not a valid class selector expected .className
+error on line 1, column 1: Not a valid class selector expected .className
 . foo { color: #ff00ff; }
 ^''');
   expect(stylesheet != null, true);
@@ -164,7 +164,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:18: Bad hex number
+error on line 1, column 18: Bad hex number
 .foobar { color: #AH787; }
                  ^^^^^^''');
   expect(stylesheet != null, true);
@@ -179,7 +179,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:18: Unknown property value redder
+error on line 1, column 18: Unknown property value redder
 .foobar { color: redder; }
                  ^^^^^^''');
 
@@ -195,7 +195,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:18: Expected hex number
+error on line 1, column 18: Expected hex number
 .foobar { color: # ffffff; }
                  ^''');
 
@@ -211,7 +211,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(), r'''
-error :1:18: Expected hex number
+error on line 1, column 18: Expected hex number
 .foobar { color: # 123fff; }
                  ^''');
 
@@ -238,7 +238,8 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(),
-      'error :3:20: unicode first range can not be greater than last\n'
+      'error on line 3, column 20: unicode first range can not be greater than '
+        'last\n'
       '  unicode-range: U+400-200;\n'
       '                   ^^^^^^^');
 
@@ -252,7 +253,7 @@
 
   expect(errors.isEmpty, false);
   expect(errors[0].toString(),
-      'error :3:20: unicode range must be less than 10FFFF\n'
+      'error on line 3, column 20: unicode range must be less than 10FFFF\n'
       '  unicode-range: U+12FFFF;\n'
       '                   ^^^^^^');
 }
diff --git a/pkg/csslib/test/selector_test.dart b/pkg/csslib/test/selector_test.dart
index f87136e..3f764e7 100644
--- a/pkg/csslib/test/selector_test.dart
+++ b/pkg/csslib/test/selector_test.dart
@@ -54,10 +54,11 @@
   // Test for invalid class name (can't start with number).
   var selectorAst = selector('.foobar .1a-story .xyzzy', errors: errors);
   expect(errors.isEmpty, false);
-  expect(errors[0].toString(), r'''
-error :1:9: name must start with a alpha character, but found a number
-.foobar .1a-story .xyzzy
-        ^^''');
+  expect(errors[0].toString(),
+      'error on line 1, column 9: name must start with a alpha character, but '
+        'found a number\n'
+      '.foobar .1a-story .xyzzy\n'
+      '        ^^');
 }
 
 main() {
diff --git a/pkg/csslib/test/var_test.dart b/pkg/csslib/test/var_test.dart
index d38569a..0ec2852 100644
--- a/pkg/csslib/test/var_test.dart
+++ b/pkg/csslib/test/var_test.dart
@@ -392,25 +392,25 @@
 }''';
 
   var errorStrings = [
-    'error :5:14: Variable is not defined.\n'
+    'error on line 5, column 14: Variable is not defined.\n'
     '  var-a: var(b);\n'
     '             ^^',
-    'error :6:14: Variable is not defined.\n'
+    'error on line 6, column 14: Variable is not defined.\n'
     '  var-b: var(c);\n'
     '             ^^',
-    'error :9:16: Variable is not defined.\n'
+    'error on line 9, column 16: Variable is not defined.\n'
     '  var-one: var(two);\n'
     '               ^^^^',
-    'error :12:17: Variable is not defined.\n'
+    'error on line 12, column 17: Variable is not defined.\n'
     '  var-four: var(five);\n'
     '                ^^^^^',
-    'error :13:17: Variable is not defined.\n'
+    'error on line 13, column 17: Variable is not defined.\n'
     '  var-five: var(six);\n'
     '                ^^^^',
-    'error :16:18: Variable is not defined.\n'
+    'error on line 16, column 18: Variable is not defined.\n'
     '  var-def-1: var(def-2);\n'
     '                 ^^^^^^',
-    'error :17:18: Variable is not defined.\n'
+    'error on line 17, column 18: Variable is not defined.\n'
     '  var-def-2: var(def-3);\n'
     '                 ^^^^^^',
     ];
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index 6b50777..428f4c7 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -42,8 +42,9 @@
     String introFileName: '', String out: gen.DEFAULT_OUTPUT_DIRECTORY,
     List<String> excludeLibraries: const [],
     bool includeDependentPackages: false, bool compile: false,
-    bool serve: false, bool noDocs: false, String startPage, String pubScript,
-    String dartBinary, bool indentJSON: false}) {
+    bool serve: false, bool noDocs: false, String startPage,
+    String pubScript : 'pub', String dartBinary: 'dart',
+    bool indentJSON: false}) {
   var result;
   if (!noDocs) {
     viewer.ensureMovedViewerCode();
diff --git a/pkg/docgen/lib/src/generator.dart b/pkg/docgen/lib/src/generator.dart
index 0531869..06a991e 100644
--- a/pkg/docgen/lib/src/generator.dart
+++ b/pkg/docgen/lib/src/generator.dart
@@ -26,7 +26,7 @@
 import 'io.dart';
 import 'library_helpers.dart';
 import 'models.dart';
-import 'package_helpers.dart' show packageNameFor, rootDirectory;
+import 'package_helpers.dart';
 
 const String DEFAULT_OUTPUT_DIRECTORY = 'docs';
 
@@ -203,7 +203,8 @@
       'libraries': filteredEntities.where((e) => e is Library).map((e) =>
           e.previewMap).toList(),
       'introduction': _readIntroductionFile(introFileName, includeSdk),
-      'filetype': 'json'
+      'filetype': 'json',
+      'sdkVersion': packageVersion(coreLibrary.mirror)
     };
 
   var encoder = new JsonEncoder.withIndent(indentJson ? '  ' : null);
@@ -295,8 +296,8 @@
     var type = FileSystemEntity.typeSync(files.first);
     if (type == FileSystemEntityType.DIRECTORY) {
       var files2 = listDir(files.first, recursive: true);
-      // Return '' means that there was no pubspec.yaml and therefor no p
-      // ackageRoot.
+      // Return '' means that there was no pubspec.yaml and therefore no
+      // packageRoot.
       packageRoot = files2.firstWhere((f) => f.endsWith(
           '${path.separator}pubspec.yaml'), orElse: () => '');
       if (packageRoot != '') {
diff --git a/pkg/docgen/lib/src/library_helpers.dart b/pkg/docgen/lib/src/library_helpers.dart
index 78db9e9..24e89d3 100644
--- a/pkg/docgen/lib/src/library_helpers.dart
+++ b/pkg/docgen/lib/src/library_helpers.dart
@@ -46,7 +46,7 @@
 
 /// The dart:core library, which contains all types that are always available
 /// without import.
-Library _coreLibrary;
+Library coreLibrary;
 
 /// Set of libraries declared in the SDK, so libraries that can be accessed
 /// when running dart by default.
@@ -102,9 +102,9 @@
 String findElementInScopeWithPrefix(String name, String packagePrefix) {
   var lookupFunc = determineLookupFunc(name);
   // Look in the dart core library scope.
-  var coreScope = _coreLibrary == null ? null : lookupFunc(_coreLibrary.mirror,
+  var coreScope = coreLibrary == null ? null : lookupFunc(coreLibrary.mirror,
       name);
-  if (coreScope != null) return packagePrefix + _coreLibrary.docName;
+  if (coreScope != null) return packagePrefix + coreLibrary.docName;
 
   // If it's a reference that starts with a another library name, then it
   // looks for a match of that library name in the other sdk libraries.
@@ -149,8 +149,8 @@
   if (owner != null) {
     var firstSet = docgenObj[owner.docName];
     if (firstSet != null) setToExamine.add(firstSet);
-    if (_coreLibrary != null && docgenObj[_coreLibrary.docName] != null) {
-      setToExamine.add(docgenObj[_coreLibrary.docName]);
+    if (coreLibrary != null && docgenObj[coreLibrary.docName] != null) {
+      setToExamine.add(docgenObj[coreLibrary.docName]);
     }
   } else {
     setToExamine.addAll(docgenObj.values);
@@ -174,7 +174,7 @@
 void initializeTopLevelLibraries(MirrorSystem mirrorSystem) {
   _sdkLibraries = mirrorSystem.libraries.values.where(
       (each) => each.uri.scheme == 'dart');
-  _coreLibrary = new Library(_sdkLibraries.singleWhere((lib) =>
+  coreLibrary = new Library(_sdkLibraries.singleWhere((lib) =>
       lib.uri.toString().startsWith('dart:core')));
 }
 
diff --git a/pkg/docgen/lib/src/models/library.dart b/pkg/docgen/lib/src/models/library.dart
index 826536f..ccd12a2 100644
--- a/pkg/docgen/lib/src/models/library.dart
+++ b/pkg/docgen/lib/src/models/library.dart
@@ -142,6 +142,8 @@
     if (packageIntro != null) {
       map['packageIntro'] = packageIntro;
     }
+    var version = packageVersion(mirror);
+    if (version != '' && version != null) map['version'] = version;
     return map;
   }
 
diff --git a/pkg/docgen/lib/src/package_helpers.dart b/pkg/docgen/lib/src/package_helpers.dart
index e8a36fc..ca189fa 100644
--- a/pkg/docgen/lib/src/package_helpers.dart
+++ b/pkg/docgen/lib/src/package_helpers.dart
@@ -5,6 +5,7 @@
 library docgen.package_helpers;
 
 import 'exports/source_mirrors.dart';
+import 'generator.dart' show pubScript;
 
 import 'dart:io';
 import 'package:path/path.dart' as path;
@@ -58,14 +59,55 @@
   }
 }
 
-/// Read a pubspec and return the library name, given a directory
-String packageNameFor(String directoryName) {
+Map _getPubspec(String directoryName) {
   var pubspecName = path.join(directoryName, 'pubspec.yaml');
   File pubspec = new File(pubspecName);
-  if (!pubspec.existsSync()) return '';
+  if (!pubspec.existsSync()) return {'name': ''};
   var contents = pubspec.readAsStringSync();
+  return loadYaml(contents);
+}
+
+/// Read a pubspec and return the library name, given a directory
+String packageNameFor(String directoryName) =>
+    _getPubspec(directoryName)['name'];
+
+/// Read a pubspec and return the library name, given a directory
+String _packageVersionFor(String directoryName) {
+  var spec = _getPubspec(directoryName);
+  return '${spec['name']}-${spec['version']}';
+}
+
+/// Look in the pubspec.lock to determine what version of a package we are
+/// documenting (null if not applicable).
+String packageVersion(LibraryMirror mirror) {
+  if (mirror.uri.scheme == 'file') {
+    String packageDirectory = getPackageDirectory(mirror);
+    if (packageDirectory == null) return '';
+    if (packageDirectory.contains('.pub-cache')) {
+      return path.basename(packageDirectory);
+    }
+    String packageName = packageNameFor(packageDirectory);
+    return _packageVersionFor(packageDirectory);
+  } else if (mirror.uri.scheme == 'dart') {
+    // If this item is from the SDK, use what version of pub we're running to
+    // ascertain the SDK version.
+    var pubVersion = Process.runSync(pubScript, ['--version'],
+        runInShell: true);
+    if (pubVersion.exitCode != 0) {
+      print(pubVersion.stderr);
+    }
+    return pubVersion.stdout.replaceAll('Pub ', '').trim();
+  }
+  return '';
+}
+
+String _packageVersionHelper(String packageDirectory, String packageName) {
+  var publockName = path.join(packageDirectory, 'pubspec.lock');
+  File publock = new File(publockName);
+  if (!publock.existsSync()) return '';
+  var contents = publock.readAsStringSync();
   var spec = loadYaml(contents);
-  return spec["name"];
+  return spec['packages'][packageName];
 }
 
 /// Recursively walk up from directory name looking for a pubspec. Return
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 6272720..f9f3244 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -59,6 +59,7 @@
 third_party/html5lib/test/tokenizer_test: Pass, Timeout
 
 [ $runtime == vm && ( $arch == simarm || $arch == simmips ) ]
+analysis_server/test/*: Skip # Too slow
 barback/test/too_many_open_files_test: Skip # 14220
 code_transformers/test/resolver_test: Skip # Issue 17908
 docgen/test/*: Skip # Too slow
@@ -174,7 +175,6 @@
 
 [ $runtime == vm && $system == windows ]
 intl/test/find_default_locale_standalone_test: Fail # Issue 8110
-analysis_server/test/resource_test: RuntimeError # Issue 19014
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 # These tests are runtime negative but statically positive, so we skip
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index c8e8a18..f0a231b 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -367,9 +367,12 @@
   /// Validate event handlers are used correctly.
   void _validateEventHandler(Element node, String name, String value) {
     if (!name.startsWith('on-')) {
+      // TODO(sigmund): technically these are valid attribtues in HTML, so we
+      // might want to remove this warning, or only produce it if the value
+      // looks like a binding.
       _logger.warning('Event handler "$name" will be interpreted as an inline'
           ' JavaScript event handler. Use the form '
-          'on-event-name="handlerName" if you want a Dart handler '
+          'on-event-name="{{handlerName}}" if you want a Dart handler '
           'that will automatically update the UI based on model changes.',
           span: node.attributeSpans[name]);
       return;
@@ -379,12 +382,17 @@
       _logger.warning('Inline event handlers are only supported inside '
           'declarations of <polymer-element>.',
           span: node.attributeSpans[name]);
+      return;
     }
 
-    if (value.contains('(')) {
+
+    // Valid bindings have {{ }}, don't look like method calls foo(bar), and are
+    // non empty.
+    if (!value.startsWith("{{") || !value.endsWith("}}") || value.contains('(')
+        || value.substring(2, value.length - 2).trim() == '') {
       _logger.warning('Invalid event handler body "$value". Declare a method '
           'in your custom element "void handlerName(event, detail, target)" '
-          'and use the form $name="handlerName".',
+          'and use the form $name="{{handlerName}}".',
           span: node.attributeSpans[name]);
     }
   }
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index efd3571..b633360 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -514,6 +514,7 @@
   void _addExpression(String stringExpression, bool inEvent, bool isTwoWay) {
     if (inEvent) {
       if (!stringExpression.startsWith("@")) {
+        if (stringExpression == '') return;
         generator.addGetter(stringExpression);
         generator.addSymbol(stringExpression);
         return;
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index f7bb7cc..590cd14 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.10.0-pre.13
+version: 0.10.0-pre.14.dev
 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
diff --git a/pkg/polymer/test/build/linter_test.dart b/pkg/polymer/test/build/linter_test.dart
index e066960..4fa25ae 100644
--- a/pkg/polymer/test/build/linter_test.dart
+++ b/pkg/polymer/test/build/linter_test.dart
@@ -323,7 +323,7 @@
       }, [
         'warning: Event handler "onfoo" will be interpreted as an inline '
         'JavaScript event handler. Use the form '
-        'on-event-name="handlerName" if you want a Dart handler '
+        'on-event-name="{{handlerName}}" if you want a Dart handler '
         'that will automatically update the UI based on model changes. '
         '(lib/test.html 1 5)'
       ]);
@@ -340,19 +340,43 @@
 
     _testLinter('on-foo is not an expression', {
         'a|lib/test.html': '''<html><body>
-            <polymer-element name="x-a"><div on-foo="bar()"></div>
+            <polymer-element name="x-a"><div on-foo="{{bar()}}"></div>
             </polymer-element>
             '''.replaceAll('            ', ''),
       }, [
-        'warning: Invalid event handler body "bar()". Declare a method '
+        'warning: Invalid event handler body "{{bar()}}". Declare a method '
         'in your custom element "void handlerName(event, detail, target)" '
-        'and use the form on-foo="handlerName". '
+        'and use the form on-foo="{{handlerName}}". '
+        '(lib/test.html 1 33)'
+      ]);
+
+    _testLinter('on-foo can\'t be empty', {
+        'a|lib/test.html': '''<html><body>
+            <polymer-element name="x-a"><div on-foo="{{}}"></div>
+            </polymer-element>
+            '''.replaceAll('            ', ''),
+      }, [
+        'warning: Invalid event handler body "{{}}". Declare a method '
+        'in your custom element "void handlerName(event, detail, target)" '
+        'and use the form on-foo="{{handlerName}}". '
+        '(lib/test.html 1 33)'
+      ]);
+
+    _testLinter('on-foo can\'t be empty', {
+        'a|lib/test.html': '''<html><body>
+            <polymer-element name="x-a"><div on-foo="{{ }}"></div>
+            </polymer-element>
+            '''.replaceAll('            ', ''),
+      }, [
+        'warning: Invalid event handler body "{{ }}". Declare a method '
+        'in your custom element "void handlerName(event, detail, target)" '
+        'and use the form on-foo="{{handlerName}}". '
         '(lib/test.html 1 33)'
       ]);
 
     _testLinter('on-foo-bar is supported as a custom event name', {
         'a|lib/test.html': '''<html><body>
-            <polymer-element name="x-a"><div on-foo-bar="quux"></div>
+            <polymer-element name="x-a"><div on-foo-bar="{{quux}}"></div>
             </polymer-element>
             '''.replaceAll('            ', ''),
       }, []);
diff --git a/pkg/polymer/test/build/script_compactor_test.dart b/pkg/polymer/test/build/script_compactor_test.dart
index a2dc1c6..7b57ed8 100644
--- a/pkg/polymer/test/build/script_compactor_test.dart
+++ b/pkg/polymer/test/build/script_compactor_test.dart
@@ -653,18 +653,24 @@
           '<!DOCTYPE html><html><body>'
           '<polymer-element name="foo-bar"><template>'
           '<div>{{a.node}}</div>'
-          '<div>{{anotherNode}}</div>'
+          '<div>{{ anotherNode }}</div>' // extra space inside bindings is OK
           '<div>{{a.call1(a)}}</div>'
           '<div>{{call2(a)}}</div>'
+          '<div>{{}}</div>'              // empty bindings are ignored
+          '<div>{{ }}</div>'
           '<div class="{{an.attribute}}"></div>'
           '<a href="path/{{within.an.attribute}}/foo/bar"></a>'
           '<div data-attribute="{{anotherAttribute}}"></div>'
           // input and custom-element attributes are treated as 2-way bindings:
-          '<input value="{{this.is.twoWay}}">'
-          '<input value="{{this.is.twoWayInt | intToStringTransformer}}">'
+          '<input value="{{this.iS.twoWay}}">'
+          '<input value="{{this.iS.twoWayInt | intToStringTransformer}}">'
           '<something-else my-attribute="{{here.too}}"></something-else>'
           '<div on-click="{{methodName}}"></div>'
+          '<div on-click="{{ methodName2 }}"></div>' // extra space is OK
           '<div on-click="{{@read.method}}"></div>'
+          // empty handlers are invalid, but we still produce valid output.
+          '<div on-click="{{}}"></div>'
+          '<div on-click="{{ }}"></div>'
           '</template></polymer-element>',
       'a|web/test.html._data': expectedData(['web/a.dart']),
       'a|web/a.dart':
@@ -689,10 +695,11 @@
                   #call1: (o) => o.call1,
                   #call2: (o) => o.call2,
                   #here: (o) => o.here,
+                  #iS: (o) => o.iS,
                   #intToStringTransformer: (o) => o.intToStringTransformer,
-                  #is: (o) => o.is,
                   #method: (o) => o.method,
                   #methodName: (o) => o.methodName,
+                  #methodName2: (o) => o.methodName2,
                   #node: (o) => o.node,
                   #read: (o) => o.read,
                   #too: (o) => o.too,
@@ -714,10 +721,11 @@
                   #call1: r'call1',
                   #call2: r'call2',
                   #here: r'here',
+                  #iS: r'iS',
                   #intToStringTransformer: r'intToStringTransformer',
-                  #is: r'is',
                   #method: r'method',
                   #methodName: r'methodName',
+                  #methodName2: r'methodName2',
                   #node: r'node',
                   #read: r'read',
                   #too: r'too',
diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart
index c33a262..a33abeb 100644
--- a/pkg/polymer_expressions/lib/eval.dart
+++ b/pkg/polymer_expressions/lib/eval.dart
@@ -650,7 +650,12 @@
     var key = argument._value;
     _value = receiverValue[key];
 
-    if (receiverValue is Observable) {
+    if (receiverValue is ObservableList) {
+      _subscription = (receiverValue as ObservableList).listChanges
+          .listen((changes) {
+        if (changes.any((c) => c.indexChanged(key))) _invalidate(scope);
+      });
+    } else if (receiverValue is Observable) {
       _subscription = (receiverValue as Observable).changes.listen((changes) {
         if (changes.any((c) => c is MapChangeRecord && c.key == key)) {
           _invalidate(scope);
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
index 1035fc2..213acac 100644
--- a/pkg/polymer_expressions/pubspec.yaml
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer_expressions
-version: 0.10.0-pre.2
+version: 0.10.0-pre.3
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: An expressive custom binding syntax for HTML templates
 homepage: http://www.dartlang.org/polymer-dart/
diff --git a/pkg/polymer_expressions/test/bindings_test.dart b/pkg/polymer_expressions/test/bindings_test.dart
index 5e681c9..3aac607 100644
--- a/pkg/polymer_expressions/test/bindings_test.dart
+++ b/pkg/polymer_expressions/test/bindings_test.dart
@@ -130,6 +130,33 @@
       });
     });
 
+    test('detects changes to ObservableList', () {
+      var list = new ObservableList.from([1, 2, 3]);
+      var template = templateBind(new Element.html(
+          '<template>{{x[1]}}</template>'));
+      var model = new NotifyModel(list);
+      testDiv.append(template.createInstance(model, new PolymerExpressions()));
+
+      return new Future(() {
+        expect(testDiv.text, '2');
+        list[1] = 10;
+      }).then(_nextMicrotask).then((_) {
+        expect(testDiv.text, '10');
+        list[1] = 11;
+      }).then(_nextMicrotask).then((_) {
+        expect(testDiv.text, '11');
+        list[0] = 9;
+      }).then(_nextMicrotask).then((_) {
+        expect(testDiv.text, '11');
+        list.removeAt(0);
+      }).then(_nextMicrotask).then((_) {
+        expect(testDiv.text, '3');
+        list.add(90);
+        list.removeAt(0);
+      }).then(_nextMicrotask).then((_) {
+        expect(testDiv.text, '90');
+      });
+    });
 
     test('detects changes to ObservableMap keys/values', () {
       var map = new ObservableMap.from({'a': 1, 'b': 2});
diff --git a/pkg/scheduled_test/CHANGELOG.md b/pkg/scheduled_test/CHANGELOG.md
index 4ae4efb..fe09dd6 100644
--- a/pkg/scheduled_test/CHANGELOG.md
+++ b/pkg/scheduled_test/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.11.0+4
+
+* Added `README.md` with content from `lib/scheduled_test.dart`.
+
+* Made changes to `test/metatest.dart` related to outstanding issues.
+
 ## 0.11.0+3
 
 * Support `v0.11.0` of `unittest`.
diff --git a/pkg/scheduled_test/README.md b/pkg/scheduled_test/README.md
new file mode 100644
index 0000000..e1af015
--- /dev/null
+++ b/pkg/scheduled_test/README.md
@@ -0,0 +1,181 @@
+A package for writing readable tests of asynchronous behavior.
+
+This package works by building up a queue of asynchronous tasks called a
+"schedule", then executing those tasks in order. This allows the tests to
+read like synchronous, linear code, despite executing asynchronously.
+
+The `scheduled_test` package is built on top of `unittest`, and should be
+imported instead of `unittest`. It provides its own version of [group],
+[test], and [setUp], and re-exports most other APIs from unittest.
+
+To schedule a task, call the [schedule] function. For example:
+
+```dart
+import 'package:scheduled_test/scheduled_test.dart';
+
+void main() {
+  test('writing to a file and reading it back should work', () {
+    schedule(() {
+      // The schedule won't proceed until the returned Future has
+      // completed.
+      return new File("output.txt").writeAsString("contents");
+    });
+
+    schedule(() {
+      return new File("output.txt").readAsString().then((contents) {
+        // The normal unittest matchers can still be used.
+        expect(contents, equals("contents"));
+      });
+    });
+  });
+}
+```
+
+## Setting up and tearing down
+
+The `scheduled_test` package defines its own [setUp] method that works just
+like the one in `unittest`. Tasks can be scheduled in [setUp]; they'll be
+run before the tasks scheduled by tests in that group. [currentSchedule] is
+also set in the [setUp] callback.
+
+This package doesn't have an explicit `tearDown` method. Instead, the
+[currentSchedule.onComplete] and [currentSchedule.onException] task queues
+can have tasks scheduled during [setUp]. For example:
+
+```dart
+import 'package:scheduled_test/scheduled_test.dart';
+
+void main() {
+  var tempDir;
+  setUp(() {
+    schedule(() {
+      return createTempDir().then((dir) {
+        tempDir = dir;
+      });
+    });
+
+    currentSchedule.onComplete.schedule(() => deleteDir(tempDir));
+  });
+
+  // ...
+}
+```
+
+## Passing values between tasks
+
+It's often useful to use values computed in one task in other tasks that are
+scheduled afterwards. There are two ways to do this. The most
+straightforward is just to define a local variable and assign to it. For
+example:
+
+```dart
+import 'package:scheduled_test/scheduled_test.dart';
+
+void main() {
+  test('computeValue returns 12', () {
+    var value;
+
+    schedule(() {
+      return computeValue().then((computedValue) {
+        value = computedValue;
+      });
+    });
+
+    schedule(() => expect(value, equals(12)));
+  });
+}
+```
+
+However, this doesn't scale well, especially when you start factoring out
+calls to [schedule] into library methods. For that reason, [schedule]
+returns a [Future] that will complete to the same value as the return
+value of the task. For example:
+
+```dart
+import 'package:scheduled_test/scheduled_test.dart';
+
+void main() {
+  test('computeValue returns 12', () {
+    var valueFuture = schedule(() => computeValue());
+    schedule(() {
+      valueFuture.then((value) => expect(value, equals(12)));
+    });
+  });
+}
+```
+
+## Out-of-Band Callbacks
+
+Sometimes your tests will have callbacks that don't fit into the schedule.
+It's important that errors in these callbacks are still registered, though,
+and that [Schedule.onException] and [Schedule.onComplete] still run after
+they finish. When using `unittest`, you wrap these callbacks with
+`expectAsyncN`; when using `scheduled_test`, you use [wrapAsync] or
+[wrapFuture].
+
+[wrapAsync] has two important functions. First, any errors that occur in it
+will be passed into the [Schedule] instead of causing the whole test to
+crash. They can then be handled by [Schedule.onException] and
+[Schedule.onComplete]. Second, a task queue isn't considered finished until
+all of its [wrapAsync]-wrapped functions have been called. This ensures that
+[Schedule.onException] and [Schedule.onComplete] will always run after all
+the test code in the main queue.
+
+Note that the [completes], [completion], and [throws] matchers use
+[wrapAsync] internally, so they're safe to use in conjunction with scheduled
+tests.
+
+Here's an example of a test using [wrapAsync] to catch errors thrown in the
+callback of a fictional `startServer` function:
+
+```dart
+import 'package:scheduled_test/scheduled_test.dart';
+
+void main() {
+  test('sendRequest sends a request', () {
+    startServer(wrapAsync((request) {
+      expect(request.body, equals('payload'));
+      request.response.close();
+    }));
+
+    schedule(() => sendRequest('payload'));
+  });
+}
+```
+
+[wrapFuture] works similarly to [wrapAsync], but instead of wrapping a
+single callback it wraps a whole [Future] chain. Like [wrapAsync], it
+ensures that the task queue doesn't complete until the out-of-band chain has
+finished, and that any errors in the chain are piped back into the scheduled
+test. For example:
+
+```dart
+import 'package:scheduled_test/scheduled_test.dart';
+
+void main() {
+  test('sendRequest sends a request', () {
+    wrapFuture(server.nextRequest.then((request) {
+      expect(request.body, equals('payload'));
+      expect(request.headers['content-type'], equals('text/plain'));
+    }));
+
+    schedule(() => sendRequest('payload'));
+  });
+}
+```
+
+## Timeouts
+
+`scheduled_test` has a built-in timeout of 5 seconds (configurable via
+[Schedule.timeout]). This timeout is aware of the structure of the schedule;
+this means that it will reset for each task in a queue, when moving between
+queues, or almost any other sort of interaction with [currentSchedule]. As
+long as the [Schedule] knows your test is making some sort of progress, it
+won't time out.
+
+If a single task might take a long time, you can also manually tell the
+[Schedule] that it's making progress by calling [Schedule.heartbeat], which
+will reset the timeout whenever it's called.
+
+[pub]: http://pub.dartlang.org
+[pkg]: http://pub.dartlang.org/packages/scheduled_test
diff --git a/pkg/scheduled_test/lib/scheduled_test.dart b/pkg/scheduled_test/lib/scheduled_test.dart
index 720f260..cf61c25 100644
--- a/pkg/scheduled_test/lib/scheduled_test.dart
+++ b/pkg/scheduled_test/lib/scheduled_test.dart
@@ -5,188 +5,6 @@
 // TODO(nweiz): Add support for calling [schedule] while the schedule is already
 // running.
 // TODO(nweiz): Port the non-Pub-specific scheduled test libraries from Pub.
-/// A package for writing readable tests of asynchronous behavior.
-///
-/// ## Installing ##
-///
-/// Use [pub][] to install this package. Add the following to your
-/// `pubspec.yaml` file.
-///
-///     dependencies:
-///       scheduled_test: any
-///
-/// Then run `pub install`.
-///
-/// For more information, see the
-/// [scheduled_test package on pub.dartlang.org][pkg].
-///
-/// This package works by building up a queue of asynchronous tasks called a
-/// "schedule", then executing those tasks in order. This allows the tests to
-/// read like synchronous, linear code, despite executing asynchronously.
-///
-/// The `scheduled_test` package is built on top of `unittest`, and should be
-/// imported instead of `unittest`. It provides its own version of [group],
-/// [test], and [setUp], and re-exports most other APIs from unittest.
-///
-/// To schedule a task, call the [schedule] function. For example:
-///
-///     import 'package:scheduled_test/scheduled_test.dart';
-///
-///     void main() {
-///       test('writing to a file and reading it back should work', () {
-///         schedule(() {
-///           // The schedule won't proceed until the returned Future has
-///           // completed.
-///           return new File("output.txt").writeAsString("contents");
-///         });
-///
-///         schedule(() {
-///           return new File("output.txt").readAsString().then((contents) {
-///             // The normal unittest matchers can still be used.
-///             expect(contents, equals("contents"));
-///           });
-///         });
-///       });
-///     }
-///
-/// ## Setting up and tearing down
-///
-/// The `scheduled_test` package defines its own [setUp] method that works just
-/// like the one in `unittest`. Tasks can be scheduled in [setUp]; they'll be
-/// run before the tasks scheduled by tests in that group. [currentSchedule] is
-/// also set in the [setUp] callback.
-///
-/// This package doesn't have an explicit `tearDown` method. Instead, the
-/// [currentSchedule.onComplete] and [currentSchedule.onException] task queues
-/// can have tasks scheduled during [setUp]. For example:
-///
-///     import 'package:scheduled_test/scheduled_test.dart';
-///
-///     void main() {
-///       var tempDir;
-///       setUp(() {
-///         schedule(() {
-///           return createTempDir().then((dir) {
-///             tempDir = dir;
-///           });
-///         });
-///
-///         currentSchedule.onComplete.schedule(() => deleteDir(tempDir));
-///       });
-///
-///       // ...
-///     }
-///
-/// ## Passing values between tasks
-///
-/// It's often useful to use values computed in one task in other tasks that are
-/// scheduled afterwards. There are two ways to do this. The most
-/// straightforward is just to define a local variable and assign to it. For
-/// example:
-///
-///     import 'package:scheduled_test/scheduled_test.dart';
-///
-///     void main() {
-///       test('computeValue returns 12', () {
-///         var value;
-///
-///         schedule(() {
-///           return computeValue().then((computedValue) {
-///             value = computedValue;
-///           });
-///         });
-///
-///         schedule(() => expect(value, equals(12)));
-///       });
-///     }
-///
-/// However, this doesn't scale well, especially when you start factoring out
-/// calls to [schedule] into library methods. For that reason, [schedule]
-/// returns a [Future] that will complete to the same value as the return
-/// value of the task. For example:
-///
-///     import 'package:scheduled_test/scheduled_test.dart';
-///
-///     void main() {
-///       test('computeValue returns 12', () {
-///         var valueFuture = schedule(() => computeValue());
-///         schedule(() {
-///           valueFuture.then((value) => expect(value, equals(12)));
-///         });
-///       });
-///     }
-///
-/// ## Out-of-Band Callbacks
-///
-/// Sometimes your tests will have callbacks that don't fit into the schedule.
-/// It's important that errors in these callbacks are still registered, though,
-/// and that [Schedule.onException] and [Schedule.onComplete] still run after
-/// they finish. When using `unittest`, you wrap these callbacks with
-/// `expectAsyncN`; when using `scheduled_test`, you use [wrapAsync] or
-/// [wrapFuture].
-///
-/// [wrapAsync] has two important functions. First, any errors that occur in it
-/// will be passed into the [Schedule] instead of causing the whole test to
-/// crash. They can then be handled by [Schedule.onException] and
-/// [Schedule.onComplete]. Second, a task queue isn't considered finished until
-/// all of its [wrapAsync]-wrapped functions have been called. This ensures that
-/// [Schedule.onException] and [Schedule.onComplete] will always run after all
-/// the test code in the main queue.
-///
-/// Note that the [completes], [completion], and [throws] matchers use
-/// [wrapAsync] internally, so they're safe to use in conjunction with scheduled
-/// tests.
-///
-/// Here's an example of a test using [wrapAsync] to catch errors thrown in the
-/// callback of a fictional `startServer` function:
-///
-///     import 'package:scheduled_test/scheduled_test.dart';
-///
-///     void main() {
-///       test('sendRequest sends a request', () {
-///         startServer(wrapAsync((request) {
-///           expect(request.body, equals('payload'));
-///           request.response.close();
-///         }));
-///
-///         schedule(() => sendRequest('payload'));
-///       });
-///     }
-///
-/// [wrapFuture] works similarly to [wrapAsync], but instead of wrapping a
-/// single callback it wraps a whole [Future] chain. Like [wrapAsync], it
-/// ensures that the task queue doesn't complete until the out-of-band chain has
-/// finished, and that any errors in the chain are piped back into the scheduled
-/// test. For example:
-///
-///     import 'package:scheduled_test/scheduled_test.dart';
-///
-///     void main() {
-///       test('sendRequest sends a request', () {
-///         wrapFuture(server.nextRequest.then((request) {
-///           expect(request.body, equals('payload'));
-///           expect(request.headers['content-type'], equals('text/plain'));
-///         }));
-///
-///         schedule(() => sendRequest('payload'));
-///       });
-///     }
-///
-/// ## Timeouts
-///
-/// `scheduled_test` has a built-in timeout of 5 seconds (configurable via
-/// [Schedule.timeout]). This timeout is aware of the structure of the schedule;
-/// this means that it will reset for each task in a queue, when moving between
-/// queues, or almost any other sort of interaction with [currentSchedule]. As
-/// long as the [Schedule] knows your test is making some sort of progress, it
-/// won't time out.
-///
-/// If a single task might take a long time, you can also manually tell the
-/// [Schedule] that it's making progress by calling [Schedule.heartbeat], which
-/// will reset the timeout whenever it's called.
-///
-/// [pub]: http://pub.dartlang.org
-/// [pkg]: http://pub.dartlang.org/packages/scheduled_test
 library scheduled_test;
 
 import 'dart:async';
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index a89c40d..d96db15 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,7 +1,6 @@
 name: scheduled_test
-version: 0.11.0+3
+version: 0.11.0+4
 author: Dart Team <misc@dartlang.org>
-homepage: http://www.dartlang.org
 description: >
   A package for writing readable tests of asynchronous behavior.
 
@@ -9,11 +8,12 @@
   "schedule", then executing those tasks in order. This allows the tests to
   read like synchronous, linear code, despite executing asynchronously.
 
+homepage: http://www.dartlang.org
+environment:
+  sdk: '>=1.3.0 <2.0.0'
 dependencies:
   http: '>=0.9.0 <0.12.0'
   path: '>=0.9.0 <2.0.0'
   shelf: '>=0.4.0 <0.6.0'
   stack_trace: '>=0.9.1 <0.10.0'
   unittest: '>=0.9.0 <0.12.0'
-environment:
-  sdk: '>=0.8.10+6 <2.0.0'
diff --git a/pkg/scheduled_test/test/metatest.dart b/pkg/scheduled_test/test/metatest.dart
index 7550a20..3c0cd9a 100644
--- a/pkg/scheduled_test/test/metatest.dart
+++ b/pkg/scheduled_test/test/metatest.dart
@@ -157,7 +157,7 @@
     'testToRun': description,
     'replyTo': replyPort.sendPort
   }).then((_) {
-    // TODO(nweiz): Remove this timeout once issue 8417 is fixed and we can
+    // TODO(nweiz): Remove this timeout once issue 8875 is fixed and we can
     // capture top-level exceptions.
     return timeout(replyPort.first, 30 * 1000, () {
       throw 'Timed out waiting for test to complete.';
@@ -206,10 +206,7 @@
 
 /// Indents each line of [str] by two spaces.
 String _indent(String str) {
-  // TODO(nweiz): Use this simpler code once issue 2980 is fixed.
-  // return str.replaceAll(new RegExp("^", multiLine: true), "  ");
-
-  return str.split("\n").map((line) => "  $line").join("\n");
+  return str.replaceAll(new RegExp("^", multiLine: true), "  ");
 }
 
 /// Ensure that the metatest configuration is loaded.
diff --git a/pkg/shelf/CHANGELOG.md b/pkg/shelf/CHANGELOG.md
index 0a58fe9..538153e 100644
--- a/pkg/shelf/CHANGELOG.md
+++ b/pkg/shelf/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.5.4
+
+* The `shelf_io` adapter now sends the `Date` HTTP header by default.
+
+* Fixed logic for setting Server header in `shelf_io`.
+
 ## 0.5.3
 
 * Add new named parameters to `Request.change`: `scriptName` and `url`.
diff --git a/pkg/shelf/README.md b/pkg/shelf/README.md
index 7366ba8..98123a9 100644
--- a/pkg/shelf/README.md
+++ b/pkg/shelf/README.md
@@ -98,6 +98,10 @@
 response by default. If the handler returns a response with the Server header
 set, that must take precedence over the adapter's default header.
 
+An adapter should include the Date header with the time the handler returns a
+response. If the handler returns a response with the Date header set, that must
+take precedence.
+
 An adapter should ensure that asynchronous errors thrown by the handler don't
 cause the application to crash, even if they aren't reported by the future
 chain. Specifically, these errors shouldn't be passed to the root zone's error
diff --git a/pkg/shelf/lib/shelf_io.dart b/pkg/shelf/lib/shelf_io.dart
index d8d4d9c..c685302 100644
--- a/pkg/shelf/lib/shelf_io.dart
+++ b/pkg/shelf/lib/shelf_io.dart
@@ -117,10 +117,14 @@
     httpResponse.headers.set(header, value);
   });
 
-  if (response.headers[HttpHeaders.SERVER] == null) {
-    var value = httpResponse.headers.value(HttpHeaders.SERVER);
-    httpResponse.headers.set(HttpHeaders.SERVER, '$value with Shelf');
+  if (!response.headers.containsKey(HttpHeaders.SERVER)) {
+    httpResponse.headers.set(HttpHeaders.SERVER, 'dart:io with Shelf');
   }
+
+  if (!response.headers.containsKey(HttpHeaders.DATE)) {
+    httpResponse.headers.date = new DateTime.now().toUtc();
+  }
+
   return httpResponse.addStream(response.read())
       .then((_) => httpResponse.close());
 }
diff --git a/pkg/shelf/pubspec.yaml b/pkg/shelf/pubspec.yaml
index f4e338f..712ad4a 100644
--- a/pkg/shelf/pubspec.yaml
+++ b/pkg/shelf/pubspec.yaml
@@ -1,5 +1,5 @@
 name: shelf
-version: 0.5.3
+version: 0.5.4
 author: Dart Team <misc@dartlang.org>
 description: Web Server Middleware for Dart
 homepage: http://www.dartlang.org
diff --git a/pkg/shelf/test/shelf_io_test.dart b/pkg/shelf/test/shelf_io_test.dart
index 5205658..b3b4325 100644
--- a/pkg/shelf/test/shelf_io_test.dart
+++ b/pkg/shelf/test/shelf_io_test.dart
@@ -9,6 +9,7 @@
 import 'dart:io';
 
 import 'package:http/http.dart' as http;
+import 'package:http_parser/http_parser.dart' as parser;
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:shelf/shelf.dart';
 import 'package:shelf/shelf_io.dart' as shelf_io;
@@ -249,6 +250,62 @@
       });
     });
   });
+
+  group('date header', () {
+    test('is sent by default', () {
+      _scheduleServer(syncHandler);
+
+      // Update beforeRequest to be one second earlier. HTTP dates only have
+      // second-level granularity and the request will likely take less than a
+      // second.
+      var beforeRequest = new DateTime.now().subtract(new Duration(seconds: 1));
+
+      return _scheduleGet().then((response) {
+        expect(response.headers, contains('date'));
+        var responseDate = parser.parseHttpDate(response.headers['date']);
+
+        expect(responseDate.isAfter(beforeRequest), isTrue);
+        expect(responseDate.isBefore(new DateTime.now()), isTrue);
+      });
+    });
+
+    test('defers to header in response', () {
+      var date = new DateTime.utc(1981, 6, 5);
+      _scheduleServer((request) {
+        return new Response.ok('test', headers: {
+          HttpHeaders.DATE: parser.formatHttpDate(date)
+        });
+      });
+
+      return _scheduleGet().then((response) {
+        expect(response.headers, contains('date'));
+        var responseDate = parser.parseHttpDate(response.headers['date']);
+        expect(responseDate, date);
+      });
+    });
+  });
+
+  group('server header', () {
+    test('defaults to "dart:io with Shelf"', () {
+      _scheduleServer(syncHandler);
+
+      return _scheduleGet().then((response) {
+        expect(response.headers,
+            containsPair(HttpHeaders.SERVER, 'dart:io with Shelf'));
+      });
+    });
+
+    test('defers to header in response', () {
+      _scheduleServer((request) {
+        return new Response.ok('test',
+            headers: {HttpHeaders.SERVER: 'myServer'});
+      });
+
+      return _scheduleGet().then((response) {
+        expect(response.headers, containsPair(HttpHeaders.SERVER, 'myServer'));
+      });
+    });
+  });
 }
 
 int _serverPort;
diff --git a/pkg/smoke/lib/codegen/generator.dart b/pkg/smoke/lib/codegen/generator.dart
index 920462d..a313e5d 100644
--- a/pkg/smoke/lib/codegen/generator.dart
+++ b/pkg/smoke/lib/codegen/generator.dart
@@ -458,5 +458,38 @@
         "useGeneratedCode, StaticConfiguration;",
   ];
 
-_symbol(String name) =>
-   name.contains('[') ? "const Symbol('$name')" : '#$name';
+_symbol(String name) {
+  if (!_publicSymbolPattern.hasMatch(name)) {
+    throw new StateError('invalid symbol name: "$name"');
+  }
+  return _literalSymbolPattern.hasMatch(name)
+      ? '#$name' : "const Symbol('$name')";
+}
+
+// TODO(sigmund): is this included in some library we can import? I derived the
+// definitions below from sdk/lib/internal/symbol.dart.
+
+/// Reserved words in Dart.
+const String _reservedWordRE =
+    r'(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|'
+    r'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|'
+    r'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|'
+    r'v(?:ar|oid)|w(?:hile|ith))';
+
+/// Public identifier: a valid identifier (not a reserved word) that doesn't
+/// start with '_'.
+const String _publicIdentifierRE =
+    r'(?!' '$_reservedWordRE' r'\b(?!\$))[a-zA-Z$][\w$]*';
+
+/// Pattern that matches operators only.
+final RegExp _literalSymbolPattern = new RegExp(
+    '^(?:$_publicIdentifierRE(?:\$|[.](?!\$)))+?\$');
+
+/// Operator names allowed as symbols. The name of the oeprators is the same as
+/// the operator itself except for unary minus, where the name is "unary-".
+const String _operatorRE =
+    r'(?:[\-+*/%&|^]|\[\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
+
+/// Pattern that matches public symbols.
+final RegExp _publicSymbolPattern = new RegExp(
+    '^(?:$_operatorRE\$|$_publicIdentifierRE(?:=?\$|[.](?!\$)))+?\$');
diff --git a/pkg/smoke/lib/codegen/recorder.dart b/pkg/smoke/lib/codegen/recorder.dart
index 073e8fe..645d3ac 100644
--- a/pkg/smoke/lib/codegen/recorder.dart
+++ b/pkg/smoke/lib/codegen/recorder.dart
@@ -259,17 +259,17 @@
       }
 
       var positionalArgs = [];
+      var namedArgs = {};
       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');
+          namedArgs[arg.name.label.name] = _convertExpression(arg.expression);
+        } else {
+          positionalArgs.add(_convertExpression(arg));
         }
-        positionalArgs.add(_convertExpression(arg));
       }
 
       return new ConstructorExpression(importUrlFor(element.library),
-          element.enclosingElement.name, positionalArgs, const {});
+          element.enclosingElement.name, positionalArgs, namedArgs);
     }
 
     if (element is PropertyAccessorElement) {
diff --git a/pkg/smoke/pubspec.yaml b/pkg/smoke/pubspec.yaml
index dab0540..be94b9e 100644
--- a/pkg/smoke/pubspec.yaml
+++ b/pkg/smoke/pubspec.yaml
@@ -1,5 +1,5 @@
 name: smoke
-version: 0.1.0-pre.5
+version: 0.1.0-pre.6.dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: "https://api.dartlang.org/apidocs/channels/be/#smoke"
 description: >
diff --git a/pkg/smoke/test/codegen/end_to_end_test.dart b/pkg/smoke/test/codegen/end_to_end_test.dart
index 86bf22a..0413274 100644
--- a/pkg/smoke/test/codegen/end_to_end_test.dart
+++ b/pkg/smoke/test/codegen/end_to_end_test.dart
@@ -107,6 +107,9 @@
     runQuery('H', new QueryOptions(includeInherited: true,
         withAnnotations: [vars[0], vars[1], lib.getType('Annot')]));
 
+    runQuery('K', new QueryOptions(includeInherited: true,
+        withAnnotations: [lib.getType('AnnotC')]));
+
     var code = _createEntrypoint(generator);
     var staticTestFile = new File(path.join(testDir, 'static_test.dart'));
     var existingCode = staticTestFile.readAsStringSync();
diff --git a/pkg/smoke/test/codegen/generator_test.dart b/pkg/smoke/test/codegen/generator_test.dart
index ca8b000..a115ed9 100644
--- a/pkg/smoke/test/codegen/generator_test.dart
+++ b/pkg/smoke/test/codegen/generator_test.dart
@@ -54,15 +54,41 @@
     var generator = new SmokeCodeGenerator();
     generator.addSymbol('i');
     generator.addSymbol('foo');
+    generator.addSymbol('a.b.c');
+    generator.addSymbol('a.b.[]');
+    generator.addSymbol('[]');
+    generator.addSymbol('+');
     checkResults(generator, initCall:
         'useGeneratedCode(new StaticConfiguration(\n'
         '    checkedMode: false,\n'
         '    names: {\n'
+        '      const Symbol(\'+\'): r\'+\',\n'
+        '      const Symbol(\'[]\'): r\'[]\',\n'
+        '      const Symbol(\'a.b.[]\'): r\'a.b.[]\',\n'
+        '      #a.b.c: r\'a.b.c\',\n'
         '      #foo: r\'foo\',\n'
         '      #i: r\'i\',\n'
         '    }));\n');
   });
 
+  group('invalid symbols', () {
+    var invalidError =
+        predicate((e) => e is StateError && '$e'.contains("invalid symbol"));
+    test('traling period', () {
+      var generator = new SmokeCodeGenerator();
+      generator.addSymbol('a.');
+      var sb = new StringBuffer();
+      expect(() => generator.writeInitCall(sb), throwsA(invalidError));
+    });
+
+    test('operator in the middle', () {
+      var generator = new SmokeCodeGenerator();
+      generator.addSymbol('a.[].b');
+      var sb = new StringBuffer();
+      expect(() => generator.writeInitCall(sb), throwsA(invalidError));
+    });
+  });
+
   test('getters, setters, and names', () {
     var generator = new SmokeCodeGenerator();
     generator.addGetter('i');
diff --git a/pkg/smoke/test/codegen/recorder_test.dart b/pkg/smoke/test/codegen/recorder_test.dart
index 091abac..14f8d81 100644
--- a/pkg/smoke/test/codegen/recorder_test.dart
+++ b/pkg/smoke/test/codegen/recorder_test.dart
@@ -67,7 +67,7 @@
           imports: [
             "import '/a.dart' as smoke_0;",
           ],
-          topLevel: 
+          topLevel:
             'abstract class _M0 {} // A & D1\n'
             'abstract class _M1 {} // _M0 & D2\n'
             'abstract class _M2 {} // _M1 & D3\n',
@@ -573,6 +573,28 @@
             '      },\n'
             '    }));\n');
     });
+
+    test('type annotation with named arguments', () {
+      var lib = provider.libraryFor('/common.dart');
+      var options = new QueryOptions(includeInherited: true,
+          withAnnotations: [lib.getType('AnnotC')]);
+      recorder.runQuery(lib.getType('K'), options, includeAccessors: false);
+      final kAnnot = 'annotations: const [const smoke_0.AnnotC(named: true)]';
+      final k2Annot = 'annotations: const [const smoke_0.AnnotC()]';
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.K: {\n'
+            '        #k: const Declaration(#k, int, $kAnnot),\n'
+            '        #k2: const Declaration(#k2, int, $k2Annot),\n'
+            '      },\n'
+            '    }));\n');
+    });
   });
 
   group('with accessors', () {
@@ -801,6 +823,7 @@
 
       class Annot { const Annot(int ignore); }
       class AnnotB extends Annot { const AnnotB(); }
+      class AnnotC { const AnnotC({bool named: false}); }
       const a1 = const Annot(0);
       const a2 = 32;
       const a3 = const AnnotB();
@@ -837,6 +860,11 @@
       }
       class J3 extends J2 {
       }
+
+      class K {
+        @AnnotC(named: true) int k;
+        @AnnotC() int k2;
+      }
       '''
 };
 
diff --git a/pkg/smoke/test/common.dart b/pkg/smoke/test/common.dart
index eaffd25..f8ce624 100644
--- a/pkg/smoke/test/common.dart
+++ b/pkg/smoke/test/common.dart
@@ -370,6 +370,7 @@
 
 class Annot { const Annot(); }
 class AnnotB extends Annot { const AnnotB(); }
+class AnnotC { const AnnotC({bool named: false}); }
 const a1 = const Annot();
 const a2 = 32;
 const a3 = const AnnotB();
@@ -389,3 +390,8 @@
   @a2 int h;
   @a3 int i;
 }
+
+class K {
+  @AnnotC(named: true) int k;
+  @AnnotC() int k2;
+}
diff --git a/pkg/smoke/test/static_test.dart b/pkg/smoke/test/static_test.dart
index 896c465..3fb7582 100644
--- a/pkg/smoke/test/static_test.dart
+++ b/pkg/smoke/test/static_test.dart
@@ -79,6 +79,10 @@
           #h: const Declaration(#h, int, annotations: const [smoke_0.a2]),
           #i: const Declaration(#i, int, annotations: const [smoke_0.a3]),
         },
+        smoke_0.K: {
+          #k: const Declaration(#k, int, annotations: const [const smoke_0.AnnotC(named: true)]),
+          #k2: const Declaration(#k2, int, annotations: const [const smoke_0.AnnotC()]),
+        },
         _M0: {
           #i: const Declaration(#i, int),
           #inc: const Declaration(#inc, Function, kind: METHOD),
diff --git a/pkg/source_maps/CHANGELOG.md b/pkg/source_maps/CHANGELOG.md
new file mode 100644
index 0000000..e278458
--- /dev/null
+++ b/pkg/source_maps/CHANGELOG.md
@@ -0,0 +1,5 @@
+## 0.9.1
+
+* Support unmapped areas in source maps.
+
+* Increase the readability of location messages.
diff --git a/pkg/source_maps/lib/span.dart b/pkg/source_maps/lib/span.dart
index 17ccd27..f47e08e 100644
--- a/pkg/source_maps/lib/span.dart
+++ b/pkg/source_maps/lib/span.dart
@@ -7,6 +7,8 @@
 
 import 'dart:math' show min, max;
 
+import 'package:path/path.dart' as p;
+
 import 'src/utils.dart';
 
 /// A simple class that describe a segment of source text.
@@ -252,8 +254,8 @@
     var line = getLine(start);
     var column = getColumn(line, start);
 
-    var src = url == null ? '' : url;
-    var msg = '$src:${line + 1}:${column + 1}: $message';
+    var source = url == null ? '' : ' of ${p.prettyUri(url)}';
+    var msg = 'line ${line + 1}, column ${column + 1}$source: $message';
 
     if (_decodedChars == null) {
       // We don't have any text to include, so exit.
diff --git a/pkg/source_maps/pubspec.yaml b/pkg/source_maps/pubspec.yaml
index 71cbfb5..3c946e0 100644
--- a/pkg/source_maps/pubspec.yaml
+++ b/pkg/source_maps/pubspec.yaml
@@ -1,8 +1,10 @@
 name: source_maps
-version: 0.9.1-dev
+version: 0.9.1
 author: Dart Team <misc@dartlang.org>
 description: Library to programmatically manipulate source map files.
 homepage: http://www.dartlang.org
+dependencies:
+  path: '>=1.2.0 <2.0.0'
 environment:
   sdk: '>=0.8.10+6 <2.0.0'
 dev_dependencies:
diff --git a/pkg/source_maps/test/refactor_test.dart b/pkg/source_maps/test/refactor_test.dart
index c153d90..5d0abf1 100644
--- a/pkg/source_maps/test/refactor_test.dart
+++ b/pkg/source_maps/test/refactor_test.dart
@@ -60,33 +60,38 @@
 
     // Line 1 and 2 are unmodified: mapping any column returns the beginning
     // of the corresponding line:
-    expect(_span(1, 1, map, file), ":1:1: \n0123456789");
-    expect(_span(1, 5, map, file), ":1:1: \n0123456789");
-    expect(_span(2, 1, map, file), ":2:1: \n0*23456789");
-    expect(_span(2, 8, map, file), ":2:1: \n0*23456789");
+    expect(_span(1, 1, map, file), "line 1, column 1 of .: \n0123456789");
+    expect(_span(1, 5, map, file), "line 1, column 1 of .: \n0123456789");
+    expect(_span(2, 1, map, file), "line 2, column 1 of .: \n0*23456789");
+    expect(_span(2, 8, map, file), "line 2, column 1 of .: \n0*23456789");
 
     // Line 3 is modified part way: mappings before the edits have the right
     // mapping, after the edits the mapping is null.
-    expect(_span(3, 1, map, file), ":3:1: \n01*3456789");
-    expect(_span(3, 5, map, file), ":3:1: \n01*3456789");
+    expect(_span(3, 1, map, file), "line 3, column 1 of .: \n01*3456789");
+    expect(_span(3, 5, map, file), "line 3, column 1 of .: \n01*3456789");
 
     // Start of edits map to beginning of the edit secion:
-    expect(_span(3, 6, map, file), ":3:6: \n01*3456789");
-    expect(_span(3, 7, map, file), ":3:6: \n01*3456789");
+    expect(_span(3, 6, map, file), "line 3, column 6 of .: \n01*3456789");
+    expect(_span(3, 7, map, file), "line 3, column 6 of .: \n01*3456789");
 
     // Lines added have no mapping (they should inherit the last mapping),
     // but the end of the edit region continues were we left off:
     expect(_span(4, 1, map, file), isNull);
-    expect(_span(4, 5, map, file), ":3:8: \n01*3456789");
+    expect(_span(4, 5, map, file), "line 3, column 8 of .: \n01*3456789");
 
     // Subsequent lines are still mapped correctly:
-    expect(_span(5, 1, map, file), ":4:1: \nabcdefghij"); // a (in a___cd...)
-    expect(_span(5, 2, map, file), ":4:2: \nabcdefghij"); // _ (in a___cd...)
-    expect(_span(5, 3, map, file), ":4:2: \nabcdefghij"); // _ (in a___cd...)
-    expect(_span(5, 4, map, file), ":4:2: \nabcdefghij"); // _ (in a___cd...)
-    expect(_span(5, 5, map, file), ":4:3: \nabcdefghij"); // c (in a___cd...)
-    expect(_span(6, 1, map, file), ":5:1: \nabcd*fghij");
-    expect(_span(6, 8, map, file), ":5:1: \nabcd*fghij");
+    // a (in a___cd...)
+    expect(_span(5, 1, map, file), "line 4, column 1 of .: \nabcdefghij");
+    // _ (in a___cd...)
+    expect(_span(5, 2, map, file), "line 4, column 2 of .: \nabcdefghij");
+    // _ (in a___cd...)
+    expect(_span(5, 3, map, file), "line 4, column 2 of .: \nabcdefghij");
+    // _ (in a___cd...)
+    expect(_span(5, 4, map, file), "line 4, column 2 of .: \nabcdefghij");
+    // c (in a___cd...)
+    expect(_span(5, 5, map, file), "line 4, column 3 of .: \nabcdefghij");
+    expect(_span(6, 1, map, file), "line 5, column 1 of .: \nabcd*fghij");
+    expect(_span(6, 8, map, file), "line 5, column 1 of .: \nabcd*fghij");
   });
 }
 
diff --git a/pkg/source_maps/test/span_test.dart b/pkg/source_maps/test/span_test.dart
index da3e063..190b7a6 100644
--- a/pkg/source_maps/test/span_test.dart
+++ b/pkg/source_maps/test/span_test.dart
@@ -72,7 +72,7 @@
   group('location message', () {
     test('first line', () {
       expect(file.getLocationMessage('the message', 1, 3),
-          'file:1:2: the message\n'
+          'line 1, column 2 of file: the message\n'
           '+23456789_\n'
           ' ^^');
     });
@@ -81,7 +81,7 @@
       // fifth line (including 4 new lines), columns 2 .. 11
       var line = 10 + 80 + 31 + 27 + 4;
       expect(file.getLocationMessage('the message', line + 2, line + 11),
-          'file:5:3: the message\n'
+          'line 5, column 3 of file: the message\n'
           '1234+6789_1234\n'
           '  ^^^^^^^^^');
     });
@@ -90,7 +90,7 @@
       var line = 10 + 80 + 31 + 27 + 4;
       expect(new SourceFile.text(null, TEST_FILE).getLocationMessage(
           'the message', line + 2, line + 11),
-          ':5:3: the message\n'
+          'line 5, column 3: the message\n'
           '1234+6789_1234\n'
           '  ^^^^^^^^^');
     });
@@ -100,7 +100,7 @@
       int index = TEST_FILE.lastIndexOf('\n');
       var start = TEST_FILE.lastIndexOf('\n', index - 1) - 3;
       expect(file.getLocationMessage('the message', start, start + 2),
-          'file:11:41: the message\n'
+          'line 11, column 41 of file: the message\n'
           '123456789_+23456789_123456789_123456789_123\n'
           '                                        ^^');
     });
@@ -108,7 +108,7 @@
     test('last line', () {
       var start = TEST_FILE.lastIndexOf('\n') - 2;
       expect(file.getLocationMessage('the message', start, start + 1),
-          'file:12:28: the message\n'
+          'line 12, column 28 of file: the message\n'
           '123456789_1+3456789_123456789\n'
           '                           ^');
     });
@@ -120,7 +120,7 @@
       test('penultimate line', () {
         var start = text.lastIndexOf('\n') - 3;
         expect(file2.getLocationMessage('the message', start, start + 2),
-            'file:11:41: the message\n'
+            'line 11, column 41 of file: the message\n'
             '123456789_+23456789_123456789_123456789_123\n'
             '                                        ^^');
       });
@@ -128,7 +128,7 @@
       test('last line', () {
         var start = text.length - 2;
         expect(file2.getLocationMessage('the message', start, start + 1),
-            'file:12:28: the message\n'
+            'line 12, column 28 of file: the message\n'
             '123456789_1+3456789_123456789\n'
             '                           ^');
       });
@@ -139,7 +139,7 @@
       int start = text.indexOf(' ') + 1;
       var file2 = new SourceFile.text('file', text);
       expect(file2.getLocationMessage('the message', start, start + 2),
-            'file:1:${start + 1}: the message\n'
+            'line 1, column ${start + 1} of file: the message\n'
             'this is a single line\n'
             '     ^^');
     });
@@ -178,7 +178,7 @@
 
     var line = 10 + 80 + 31 + 27 + 4;
     expect(span(line + 2, line + 11).getLocationMessage('the message'),
-        'file:5:3: the message\n'
+        'line 5, column 3 of file: the message\n'
         '1234+6789_1234\n'
         '  ^^^^^^^^^');
 
@@ -226,7 +226,7 @@
   test('range check for large offsets', () {
     var start = TEST_FILE.length;
     expect(file.getLocationMessage('the message', start, start + 9),
-        'file:13:1: the message\n');
+        'line 13, column 1 of file: the message\n');
   });
 
   group('file segment', () {
@@ -296,7 +296,7 @@
       test('past segment, past its line', () {
         var start = TEST_FILE.length - 2;
         expect(file.getLocationMessage('the message', start, start + 1),
-          'file:12:29: the message\n'
+          'line 12, column 29 of file: the message\n'
           '123456789_1+3456789_123456789\n'
           '                            ^');
 
@@ -304,7 +304,7 @@
         // about the 10 lines it has (and nothing about the possible extra lines
         // afterwards)
         expect(segment.getLocationMessage('the message', start, start + 1),
-          'file:11:1: the message\n');
+          'line 11, column 1 of file: the message\n');
       });
     });
   });
diff --git a/pkg/string_scanner/CHANGELOG.md b/pkg/string_scanner/CHANGELOG.md
new file mode 100644
index 0000000..2c41c9d
--- /dev/null
+++ b/pkg/string_scanner/CHANGELOG.md
@@ -0,0 +1,19 @@
+## 0.0.2
+
+* `new StringScanner()` now takes an optional `sourceUrl` argument that provides
+  the URL of the source file. This is used for error reporting.
+
+* Add `StringScanner.readChar()` and `StringScanner.peekChar()` methods for
+  doing character-by-character scanning.
+
+* Scanners now throw `StringScannerException`s which provide more detailed
+  access to information about the errors that were thrown and can provide
+  terminal-colored messages.
+
+* Add a `LineScanner` subclass of `StringScanner` that automatically tracks line
+  and column information of the text being scanned.
+
+* Add a `SpanScanner` subclass of `LineScanner` that exposes matched ranges as
+  [source map][] `Span` objects.
+
+[source_map]: http://pub.dartlang.org/packages/source_maps
diff --git a/pkg/string_scanner/lib/src/exception.dart b/pkg/string_scanner/lib/src/exception.dart
new file mode 100644
index 0000000..c398687
--- /dev/null
+++ b/pkg/string_scanner/lib/src/exception.dart
@@ -0,0 +1,37 @@
+// 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 string_scanner.exception;
+
+import 'package:source_maps/source_maps.dart';
+
+/// An exception thrown by a [StringScanner] that failed to parse a string.
+class StringScannerException implements FormatException {
+  /// The error message.
+  final String message;
+
+  /// The source string being parsed.
+  final String string;
+
+  /// The URL of the source file being parsed.
+  ///
+  /// This may be `null`, indicating that the source URL is unknown.
+  final Uri sourceUrl;
+
+  /// The span within [string] that caused the exception.
+  final Span span;
+
+  StringScannerException(this.message, this.string, this.sourceUrl, this.span);
+
+  /// Returns a detailed description of this exception.
+  ///
+  /// If [useColors] is true, the section of the source that caused the
+  /// exception will be colored using ANSI color codes. By default, it's colored
+  /// red, but a different ANSI code may passed via [color].
+  String toString({bool useColors: false, String color}) {
+    return "Error on " + span.getLocationMessage(
+        message, useColors: useColors, color: color);
+  }
+}
+
diff --git a/pkg/string_scanner/lib/src/line_scanner.dart b/pkg/string_scanner/lib/src/line_scanner.dart
new file mode 100644
index 0000000..4e12173
--- /dev/null
+++ b/pkg/string_scanner/lib/src/line_scanner.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 string_scanner.line_scanner;
+
+import 'string_scanner.dart';
+
+/// A subclass of [StringScanner] that tracks line and column information.
+class LineScanner extends StringScanner {
+  /// The scanner's current (zero-based) line number.
+  int get line => _line;
+  int _line = 0;
+
+  /// The scanner's current (zero-based) column number.
+  int get column => _column;
+  int _column = 0;
+
+  /// The scanner's state, including line and column information.
+  ///
+  /// This can be used to efficiently save and restore the state of the scanner
+  /// when backtracking. A given [LineScannerState] is only valid for the
+  /// [LineScanner] that created it.
+  LineScannerState get state =>
+      new LineScannerState._(this, position, line, column);
+
+  set state(LineScannerState state) {
+    if (!identical(state._scanner, this)) {
+      throw new ArgumentError("The given LineScannerState was not returned by "
+          "this LineScanner.");
+    }
+
+    super.position = state.position;
+    _line = state.line;
+    _column = state.column;
+  }
+
+  set position(int newPosition) {
+    var oldPosition = position;
+    super.position = newPosition;
+
+    if (newPosition > oldPosition) {
+      var newlines = "\n".allMatches(string.substring(oldPosition, newPosition))
+          .toList();
+      _line += newlines.length;
+      if (newlines.isEmpty) {
+        _column += newPosition - oldPosition;
+      } else {
+        _column = newPosition - newlines.last.end;
+      }
+    } else {
+      var newlines = "\n".allMatches(string.substring(newPosition, oldPosition))
+          .toList();
+      _line -= newlines.length;
+      if (newlines.isEmpty) {
+        _column -= oldPosition - newPosition;
+      } else {
+        _column = newPosition - string.lastIndexOf("\n", newPosition) - 1;
+      }
+    }
+  }
+
+  LineScanner(String string, {sourceUrl, int position})
+      : super(string, sourceUrl: sourceUrl, position: position);
+
+  int readChar() {
+    var char = super.readChar();
+    if (char == 0xA) {
+      _line += 1;
+      _column = 0;
+    } else {
+      _column += 1;
+    }
+    return char;
+  }
+
+  bool scan(Pattern pattern) {
+    var oldPosition = position;
+    if (!super.scan(pattern)) return false;
+
+    var newlines = "\n".allMatches(lastMatch[0]).toList();
+    _line += newlines.length;
+    if (newlines.isEmpty) {
+      _column += lastMatch[0].length;
+    } else {
+      _column = lastMatch[0].length - newlines.last.end;
+    }
+
+    return true;
+  }
+}
+
+/// A class representing the state of a [LineScanner].
+class LineScannerState {
+  /// The [LineScanner] that created this.
+  final LineScanner _scanner;
+
+  /// The position of the scanner in this state.
+  final int position;
+
+  /// The zero-based line number of the scanner in this state.
+  final int line;
+
+  /// The zero-based column number of the scanner in this state.
+  final int column;
+
+  LineScannerState._(this._scanner, this.position, this.line, this.column);
+}
diff --git a/pkg/string_scanner/lib/src/span_scanner.dart b/pkg/string_scanner/lib/src/span_scanner.dart
new file mode 100644
index 0000000..9060e62
--- /dev/null
+++ b/pkg/string_scanner/lib/src/span_scanner.dart
@@ -0,0 +1,95 @@
+// 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 string_scanner.span_scanner;
+
+import 'package:source_maps/source_maps.dart';
+
+import 'exception.dart';
+import 'line_scanner.dart';
+import 'string_scanner.dart';
+import 'utils.dart';
+
+/// A subclass of [LineScanner] that exposes matched ranges as source map
+/// [Span]s.
+class SpanScanner extends StringScanner implements LineScanner {
+  /// The source of the scanner.
+  ///
+  /// This caches line break information and is used to generate [Span]s.
+  final SourceFile _sourceFile;
+
+  int get line => _sourceFile.getLine(position);
+  int get column => _sourceFile.getColumn(line, position);
+
+  LineScannerState get state => new _SpanScannerState(this, position);
+
+  set state(LineScannerState state) {
+    if (state is! _SpanScannerState ||
+        !identical((state as _SpanScannerState)._scanner, this)) {
+      throw new ArgumentError("The given LineScannerState was not returned by "
+          "this LineScanner.");
+    }
+
+    this.position = state.position;
+  }
+
+  /// The [Span] for [lastMatch].
+  ///
+  /// This is the span for the entire match. There's no way to get spans for
+  /// subgroups since [Match] exposes no information about their positions.
+  Span get lastSpan => _lastSpan;
+  Span _lastSpan;
+
+  /// Returns an empty span at the current location.
+  Span get emptySpan => _sourceFile.span(position);
+
+  /// Creates a new [SpanScanner] that starts scanning from [position].
+  ///
+  /// [sourceUrl] is used as [Location.sourceUrl] for the returned [Span]s as
+  /// well as for error reporting.
+  SpanScanner(String string, sourceUrl, {int position})
+      : _sourceFile = new SourceFile.text(
+            sourceUrl is Uri ? sourceUrl.toString() : sourceUrl, string),
+        super(string, sourceUrl: sourceUrl, position: position);
+
+  /// Creates a [Span] representing the source range between [startState] and
+  /// the current position.
+  Span spanFrom(LineScannerState startState) =>
+      _sourceFile.span(startState.position, position);
+
+  bool matches(Pattern pattern) {
+    if (!super.matches(pattern)) {
+      _lastSpan = null;
+      return false;
+    }
+
+    _lastSpan = _sourceFile.span(position, lastMatch.end);
+    return true;
+  }
+
+  void error(String message, {Match match, int position, int length}) {
+    validateErrorArgs(string, match, position, length);
+
+    if (match == null && position == null && length == null) match = lastMatch;
+    if (position == null) {
+      position = match == null ? this.position : match.start;
+    }
+    if (length == null) length = match == null ? 1 : match.end - match.start;
+
+    var span = _sourceFile.span(position, position + length);
+    throw new StringScannerException(message, string, sourceUrl, span);
+  }
+}
+
+/// A class representing the state of a [SpanScanner].
+class _SpanScannerState implements LineScannerState {
+  /// The [SpanScanner] that created this.
+  final SpanScanner _scanner;
+
+  final int position;
+  int get line => _scanner._sourceFile.getLine(position);
+  int get column => _scanner._sourceFile.getColumn(line, position);
+
+  _SpanScannerState(this._scanner, this.position);
+}
diff --git a/pkg/string_scanner/lib/src/string_scanner.dart b/pkg/string_scanner/lib/src/string_scanner.dart
new file mode 100644
index 0000000..c9e7459
--- /dev/null
+++ b/pkg/string_scanner/lib/src/string_scanner.dart
@@ -0,0 +1,168 @@
+// 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 string_scanner.string_scanner;
+
+import 'package:source_maps/source_maps.dart';
+
+import 'exception.dart';
+import 'utils.dart';
+
+/// When compiled to JS, forward slashes are always escaped in [RegExp.pattern].
+///
+/// See issue 17998.
+final _slashAutoEscape = new RegExp("/").pattern == "\\/";
+
+/// A class that scans through a string using [Pattern]s.
+class StringScanner {
+  /// The URL of the source of the string being scanned.
+  ///
+  /// This is used for error reporting. It may be `null`, indicating that the
+  /// source URL is unknown or unavailable.
+  final Uri sourceUrl;
+
+  /// The string being scanned through.
+  final String string;
+
+  /// The current position of the scanner in the string, in characters.
+  int get position => _position;
+  set position(int position) {
+    if (position < 0 || position > string.length) {
+      throw new ArgumentError("Invalid position $position");
+    }
+
+    _position = position;
+  }
+  int _position = 0;
+
+  /// The data about the previous match made by the scanner.
+  ///
+  /// If the last match failed, this will be `null`.
+  Match get lastMatch => _lastMatch;
+  Match _lastMatch;
+
+  /// The portion of the string that hasn't yet been scanned.
+  String get rest => string.substring(position);
+
+  /// Whether the scanner has completely consumed [string].
+  bool get isDone => position == string.length;
+
+  /// Creates a new [StringScanner] that starts scanning from [position].
+  ///
+  /// [position] defaults to 0, the beginning of the string. [sourceUrl] is the
+  /// URL of the source of the string being scanned, if available. It can be
+  /// either a [String] or a [Uri].
+  StringScanner(this.string, {sourceUrl, int position})
+      : sourceUrl = sourceUrl is String ? Uri.parse(sourceUrl) : sourceUrl {
+    if (position != null) this.position = position;
+  }
+
+  /// Consumes a single character and returns its character code.
+  ///
+  /// This throws a [FormatException] if the string has been fully consumed. It
+  /// doesn't affect [lastMatch].
+  int readChar() {
+    if (isDone) _fail("more input");
+    return string.codeUnitAt(_position++);
+  }
+
+  /// Returns the character code of the character [offset] away from [position].
+  ///
+  /// [offset] defaults to zero, and may be negative to inspect already-consumed
+  /// characters.
+  ///
+  /// This returns `null` if [offset] points outside the string. It doesn't
+  /// affect [lastMatch].
+  int peekChar([int offset]) {
+    if (offset == null) offset = 0;
+    var index = position + offset;
+    if (index < 0 || index >= string.length) return null;
+    return string.codeUnitAt(index);
+  }
+
+  /// If [pattern] matches at the current position of the string, scans forward
+  /// until the end of the match.
+  ///
+  /// Returns whether or not [pattern] matched.
+  bool scan(Pattern pattern) {
+    var success = matches(pattern);
+    if (success) _position = _lastMatch.end;
+    return success;
+  }
+
+  /// If [pattern] matches at the current position of the string, scans forward
+  /// until the end of the match.
+  ///
+  /// If [pattern] did not match, throws a [FormatException] describing the
+  /// position of the failure. [name] is used in this error as the expected name
+  /// of the pattern being matched; if it's `null`, the pattern itself is used
+  /// instead.
+  void expect(Pattern pattern, {String name}) {
+    if (scan(pattern)) return;
+
+    if (name == null) {
+      if (pattern is RegExp) {
+        var source = pattern.pattern;
+        if (!_slashAutoEscape) source = source.replaceAll("/", "\\/");
+        name = "/$source/";
+      } else {
+        name = pattern.toString()
+            .replaceAll("\\", "\\\\").replaceAll('"', '\\"');
+        name = '"$name"';
+      }
+    }
+    _fail(name);
+  }
+
+  /// If the string has not been fully consumed, this throws a
+  /// [FormatException].
+  void expectDone() {
+    if (isDone) return;
+    _fail("no more input");
+  }
+
+  /// Returns whether or not [pattern] matches at the current position of the
+  /// string.
+  ///
+  /// This doesn't move the scan pointer forward.
+  bool matches(Pattern pattern) {
+    _lastMatch = pattern.matchAsPrefix(string, position);
+    return _lastMatch != null;
+  }
+
+  /// Throws a [FormatException] with [message] as well as a detailed
+  /// description of the location of the error in the string.
+  ///
+  /// [match] is the match information for the span of the string with which the
+  /// error is associated. This should be a match returned by this scanner's
+  /// [lastMatch] property. By default, the error is associated with the last
+  /// match.
+  ///
+  /// If [position] and/or [length] are passed, they are used as the error span
+  /// instead. If only [length] is passed, [position] defaults to the current
+  /// position; if only [position] is passed, [length] defaults to 1.
+  ///
+  /// It's an error to pass [match] at the same time as [position] or [length].
+  void error(String message, {Match match, int position, int length}) {
+    validateErrorArgs(string, match, position, length);
+
+    if (match == null && position == null && length == null) match = lastMatch;
+    if (position == null) {
+      position = match == null ? this.position : match.start;
+    }
+    if (length == null) length = match == null ? 1 : match.end - match.start;
+
+    var url = sourceUrl == null ? null : sourceUrl.toString();
+    var sourceFile = new SourceFile.text(url, string);
+    var span = sourceFile.span(position, position + length);
+    throw new StringScannerException(message, string, sourceUrl, span);
+  }
+
+  // TODO(nweiz): Make this handle long lines more gracefully.
+  /// Throws a [FormatException] describing that [name] is expected at the
+  /// current position in the string.
+  void _fail(String name) {
+    error("expected $name.", position: this.position, length: 0);
+  }
+}
diff --git a/pkg/string_scanner/lib/src/utils.dart b/pkg/string_scanner/lib/src/utils.dart
new file mode 100644
index 0000000..e556236e8
--- /dev/null
+++ b/pkg/string_scanner/lib/src/utils.dart
@@ -0,0 +1,30 @@
+// 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 string_scanner.utils;
+
+/// Validates the arguments passed to [StringScanner.error].
+void validateErrorArgs(String string, Match match, int position, int length) {
+  if (match != null && (position != null || length != null)) {
+    throw new ArgumentError("Can't pass both match and position/length.");
+  }
+
+  if (position != null) {
+    if (position < 0) {
+      throw new RangeError("position must be greater than or equal to 0.");
+    } else if (position > string.length) {
+      throw new RangeError("position must be less than or equal to the "
+          "string length.");
+    }
+  }
+
+  if (length != null && length < 0) {
+    throw new RangeError("length must be greater than or equal to 0.");
+  }
+
+  if (position != null && length != null && position + length > string.length) {
+    throw new RangeError("position plus length must not go beyond the end of "
+        "the string.");
+  }
+}
\ No newline at end of file
diff --git a/pkg/string_scanner/lib/string_scanner.dart b/pkg/string_scanner/lib/string_scanner.dart
index 3e3913b..be294f4 100644
--- a/pkg/string_scanner/lib/string_scanner.dart
+++ b/pkg/string_scanner/lib/string_scanner.dart
@@ -5,165 +5,7 @@
 /// A library for parsing strings using a sequence of patterns.
 library string_scanner;
 
-import 'dart:math' as math;
-
-/// When compiled to JS, forward slashes are always escaped in [RegExp.pattern].
-///
-/// See issue 17998.
-final _slashAutoEscape = new RegExp("/").pattern == "\\/";
-
-// TODO(nweiz): Add some integration between this and source maps.
-/// A class that scans through a string using [Pattern]s.
-class StringScanner {
-  /// The string being scanned through.
-  final String string;
-
-  /// The current position of the scanner in the string, in characters.
-  int get position => _position;
-  set position(int position) {
-    if (position < 0 || position > string.length) {
-      throw new ArgumentError("Invalid position $position");
-    }
-
-    _position = position;
-  }
-  int _position = 0;
-
-  /// The data about the previous match made by the scanner.
-  ///
-  /// If the last match failed, this will be `null`.
-  Match get lastMatch => _lastMatch;
-  Match _lastMatch;
-
-  /// The portion of the string that hasn't yet been scanned.
-  String get rest => string.substring(position);
-
-  /// Whether the scanner has completely consumed [string].
-  bool get isDone => position == string.length;
-
-  /// Creates a new [StringScanner] that starts scanning from [position].
-  ///
-  /// [position] defaults to 0, the beginning of the string.
-  StringScanner(this.string, {int position}) {
-    if (position != null) this.position = position;
-  }
-
-  /// If [pattern] matches at the current position of the string, scans forward
-  /// until the end of the match.
-  ///
-  /// Returns whether or not [pattern] matched.
-  bool scan(Pattern pattern) {
-    var success = matches(pattern);
-    if (success) _position = _lastMatch.end;
-    return success;
-  }
-
-  /// If [pattern] matches at the current position of the string, scans forward
-  /// until the end of the match.
-  ///
-  /// If [pattern] did not match, throws a [FormatException] describing the
-  /// position of the failure. [name] is used in this error as the expected name
-  /// of the pattern being matched; if it's `null`, the pattern itself is used
-  /// instead.
-  void expect(Pattern pattern, {String name}) {
-    if (scan(pattern)) return;
-
-    if (name == null) {
-      if (pattern is RegExp) {
-        var source = pattern.pattern;
-        if (!_slashAutoEscape) source = source.replaceAll("/", "\\/");
-        name = "/$source/";
-      } else {
-        name = pattern.toString()
-            .replaceAll("\\", "\\\\").replaceAll('"', '\\"');
-        name = '"$name"';
-      }
-    }
-    _fail(name);
-  }
-
-  /// If the string has not been fully consumed, this throws a
-  /// [FormatException].
-  void expectDone() {
-    if (isDone) return;
-    _fail("no more input");
-  }
-
-  /// Returns whether or not [pattern] matches at the current position of the
-  /// string.
-  ///
-  /// This doesn't move the scan pointer forward.
-  bool matches(Pattern pattern) {
-    _lastMatch = pattern.matchAsPrefix(string, position);
-    return _lastMatch != null;
-  }
-
-  /// Throws a [FormatException] with [message] as well as a detailed
-  /// description of the location of the error in the string.
-  ///
-  /// [match] is the match information for the span of the string with which the
-  /// error is associated. This should be a match returned by this scanner's
-  /// [lastMatch] property. By default, the error is associated with the last
-  /// match.
-  ///
-  /// If [position] and/or [length] are passed, they are used as the error span
-  /// instead. If only [length] is passed, [position] defaults to the current
-  /// position; if only [position] is passed, [length] defaults to 1.
-  ///
-  /// It's an error to pass [match] at the same time as [position] or [length].
-  void error(String message, {Match match, int position, int length}) {
-    if (match != null && (position != null || length != null)) {
-      throw new ArgumentError("Can't pass both match and position/length.");
-    }
-
-    if (position != null && position < 0) {
-      throw new RangeError("position must be greater than or equal to 0.");
-    }
-
-    if (length != null && length < 1) {
-      throw new RangeError("length must be greater than or equal to 0.");
-    }
-
-    if (match == null && position == null && length == null) match = lastMatch;
-    if (position == null) {
-      position = match == null ? this.position : match.start;
-    }
-    if (length == null) length = match == null ? 1 : match.end - match.start;
-
-    var newlines = "\n".allMatches(string.substring(0, position)).toList();
-    var line = newlines.length + 1;
-    var column;
-    var lastLine;
-    if (newlines.isEmpty) {
-      column = position + 1;
-      lastLine = string.substring(0, position);
-    } else {
-      column = position - newlines.last.end + 1;
-      lastLine = string.substring(newlines.last.end, position);
-    }
-
-    var remaining = string.substring(position);
-    var nextNewline = remaining.indexOf("\n");
-    if (nextNewline == -1) {
-      lastLine += remaining;
-    } else {
-      length = math.min(length, nextNewline);
-      lastLine += remaining.substring(0, nextNewline);
-    }
-
-    var spaces = new List.filled(column - 1, ' ').join();
-    var underline = new List.filled(length, '^').join();
-
-    throw new FormatException(
-        "Error on line $line, column $column: $message\n"
-        "$lastLine\n"
-        "$spaces$underline");
-  }
-
-  // TODO(nweiz): Make this handle long lines more gracefully.
-  /// Throws a [FormatException] describing that [name] is expected at the
-  /// current position in the string.
-  void _fail(String name) {
-    error("expected $name.", position: this.position, length: 1);
-  }
-}
+export 'src/exception.dart';
+export 'src/line_scanner.dart';
+export 'src/span_scanner.dart';
+export 'src/string_scanner.dart';
diff --git a/pkg/string_scanner/pubspec.yaml b/pkg/string_scanner/pubspec.yaml
index 3035901..86ae238 100644
--- a/pkg/string_scanner/pubspec.yaml
+++ b/pkg/string_scanner/pubspec.yaml
@@ -1,9 +1,12 @@
 name: string_scanner
-version: 0.0.1
+version: 0.0.2
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
   A class for parsing strings using a sequence of patterns.
+dependencies:
+  path: ">=1.2.0 <2.0.0"
+  source_maps: ">=0.9.0 <0.10.0"
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
 environment:
diff --git a/pkg/string_scanner/test/error_test.dart b/pkg/string_scanner/test/error_test.dart
index 6432197..4fe9083 100644
--- a/pkg/string_scanner/test/error_test.dart
+++ b/pkg/string_scanner/test/error_test.dart
@@ -14,10 +14,7 @@
     var scanner = new StringScanner('foo bar baz');
     scanner.expect('foo ');
     scanner.expect('bar');
-    expect(() => scanner.error('oh no!'), throwsFormattedError('''
-Error on line 1, column 5: oh no!
-foo bar baz
-    ^^^'''));
+    expect(() => scanner.error('oh no!'), throwsStringScannerException('bar'));
   });
 
   group("with match", () {
@@ -27,10 +24,7 @@
       var match = scanner.lastMatch;
       scanner.expect('bar');
       expect(() => scanner.error('oh no!', match: match),
-          throwsFormattedError('''
-Error on line 1, column 1: oh no!
-foo bar baz
-^^^^'''));
+          throwsStringScannerException('foo '));
     });
 
     test('supports a match on a previous line', () {
@@ -40,10 +34,7 @@
       var match = scanner.lastMatch;
       scanner.expect(' mi\nearth ');
       expect(() => scanner.error('oh no!', match: match),
-          throwsFormattedError('''
-Error on line 2, column 4: oh no!
-do re mi
-   ^^'''));
+          throwsStringScannerException('re'));
     });
 
     test('supports a multiline match', () {
@@ -53,10 +44,7 @@
       var match = scanner.lastMatch;
       scanner.expect(' re mi');
       expect(() => scanner.error('oh no!', match: match),
-          throwsFormattedError('''
-Error on line 1, column 9: oh no!
-foo bar baz
-        ^^^'''));
+          throwsStringScannerException('baz\ndo'));
     });
 
     test('supports a match after position', () {
@@ -66,10 +54,7 @@
       var match = scanner.lastMatch;
       scanner.position = 0;
       expect(() => scanner.error('oh no!', match: match),
-          throwsFormattedError('''
-Error on line 1, column 5: oh no!
-foo bar baz
-    ^^^'''));
+          throwsStringScannerException('bar'));
     });
   });
 
@@ -78,59 +63,47 @@
       var scanner = new StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', position: 1),
-          throwsFormattedError('''
-Error on line 1, column 2: oh no!
-foo bar baz
- ^'''));
+          throwsStringScannerException('o'));
     });
 
     test('defaults to the current position', () {
       var scanner = new StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', length: 3),
-          throwsFormattedError('''
-Error on line 1, column 5: oh no!
-foo bar baz
-    ^^^'''));
+          throwsStringScannerException('bar'));
     });
 
     test('supports an earlier position', () {
       var scanner = new StringScanner('foo bar baz');
       scanner.expect('foo ');
       expect(() => scanner.error('oh no!', position: 1, length: 2),
-          throwsFormattedError('''
-Error on line 1, column 2: oh no!
-foo bar baz
- ^^'''));
+          throwsStringScannerException('oo'));
     });
 
     test('supports a position on a previous line', () {
       var scanner = new StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar baz\ndo re mi\nearth');
       expect(() => scanner.error('oh no!', position: 15, length: 2),
-          throwsFormattedError('''
-Error on line 2, column 4: oh no!
-do re mi
-   ^^'''));
+          throwsStringScannerException('re'));
     });
 
     test('supports a multiline length', () {
       var scanner = new StringScanner('foo bar baz\ndo re mi\nearth fire water');
       scanner.expect('foo bar baz\ndo re mi\nearth');
       expect(() => scanner.error('oh no!', position: 8, length: 8),
-          throwsFormattedError('''
-Error on line 1, column 9: oh no!
-foo bar baz
-        ^^^'''));
+          throwsStringScannerException('baz\ndo r'));
     });
 
     test('supports a position after the current one', () {
       var scanner = new StringScanner('foo bar baz');
       expect(() => scanner.error('oh no!', position: 4, length: 3),
-          throwsFormattedError('''
-Error on line 1, column 5: oh no!
-foo bar baz
-    ^^^'''));
+          throwsStringScannerException('bar'));
+    });
+
+    test('supports a length of zero', () {
+      var scanner = new StringScanner('foo bar baz');
+      expect(() => scanner.error('oh no!', position: 4, length: 0),
+          throwsStringScannerException(''));
     });
   });
 
@@ -161,8 +134,13 @@
       expect(() => scanner.error("oh no!", position: 100), throwsArgumentError);
     });
 
-    test("if length is zero", () {
-      expect(() => scanner.error("oh no!", length: 0), throwsArgumentError);
+    test("if position + length is outside the string", () {
+      expect(() => scanner.error("oh no!", position: 7, length: 7),
+          throwsArgumentError);
+    });
+
+    test("if length is negative", () {
+      expect(() => scanner.error("oh no!", length: -1), throwsArgumentError);
     });
   });
 }
diff --git a/pkg/string_scanner/test/expect_error_test.dart b/pkg/string_scanner/test/expect_error_test.dart
deleted file mode 100644
index 3596e15..0000000
--- a/pkg/string_scanner/test/expect_error_test.dart
+++ /dev/null
@@ -1,104 +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.
-
-library string_scanner.expect_error_test;
-
-import 'package:string_scanner/string_scanner.dart';
-import 'package:unittest/unittest.dart';
-
-import 'utils.dart';
-
-void main() {
-  test('points to the first unconsumed character', () {
-    var scanner = new StringScanner('foo bar baz');
-    scanner.expect('foo ');
-    expect(() => scanner.expect('foo'), throwsFormattedError('''
-Error on line 1, column 5: expected "foo".
-foo bar baz
-    ^'''));
-  });
-
-  test('prints the correct line', () {
-    var scanner = new StringScanner('foo bar baz\ndo re mi\nearth fire water');
-    scanner.expect('foo bar baz\ndo ');
-    expect(() => scanner.expect('foo'), throwsFormattedError('''
-Error on line 2, column 4: expected "foo".
-do re mi
-   ^'''));
-  });
-
-  test('handles the beginning of the string correctly', () {
-    var scanner = new StringScanner('foo bar baz');
-    expect(() => scanner.expect('zap'), throwsFormattedError('''
-Error on line 1, column 1: expected "zap".
-foo bar baz
-^'''));
-  });
-
-  test('handles the end of the string correctly', () {
-    var scanner = new StringScanner('foo bar baz');
-    scanner.expect('foo bar baz');
-    expect(() => scanner.expect('bang'), throwsFormattedError('''
-Error on line 1, column 12: expected "bang".
-foo bar baz
-           ^'''));
-  });
-
-  test('handles an empty string correctly', () {
-    expect(() => new StringScanner('').expect('foo'), throwsFormattedError('''
-Error on line 1, column 1: expected "foo".
-
-^'''));
-  });
-
-  group("expected name", () {
-    test("uses the provided name", () {
-      expect(() => new StringScanner('').expect('foo bar', name: 'zap'),
-          throwsFormattedError('''
-Error on line 1, column 1: expected zap.
-
-^'''));
-    });
-
-    test("escapes string quotes", () {
-      expect(() => new StringScanner('').expect('foo"bar'),
-          throwsFormattedError('''
-Error on line 1, column 1: expected "foo\\"bar".
-
-^'''));
-    });
-
-    test("escapes string backslashes", () {
-      expect(() => new StringScanner('').expect('foo\\bar'),
-          throwsFormattedError('''
-Error on line 1, column 1: expected "foo\\\\bar".
-
-^'''));
-    });
-
-    test("prints PERL-style regexps", () {
-      expect(() => new StringScanner('').expect(new RegExp(r'foo')),
-          throwsFormattedError('''
-Error on line 1, column 1: expected /foo/.
-
-^'''));
-    });
-
-    test("escape regexp forward slashes", () {
-      expect(() => new StringScanner('').expect(new RegExp(r'foo/bar')),
-          throwsFormattedError('''
-Error on line 1, column 1: expected /foo\\/bar/.
-
-^'''));
-    });
-
-    test("does not escape regexp backslashes", () {
-      expect(() => new StringScanner('').expect(new RegExp(r'foo\bar')),
-          throwsFormattedError('''
-Error on line 1, column 1: expected /foo\\bar/.
-
-^'''));
-    });
-  });
-}
diff --git a/pkg/string_scanner/test/line_scanner_test.dart b/pkg/string_scanner/test/line_scanner_test.dart
new file mode 100644
index 0000000..8cc79a6
--- /dev/null
+++ b/pkg/string_scanner/test/line_scanner_test.dart
@@ -0,0 +1,106 @@
+// 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 string_scanner.line_scanner_test;
+
+import 'package:string_scanner/string_scanner.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  var scanner;
+  setUp(() {
+    scanner = new LineScanner('foo\nbar\nbaz');
+  });
+
+  test('begins with line and column 0', () {
+    expect(scanner.line, equals(0));
+    expect(scanner.column, equals(0));
+  });
+
+  group("scan()", () {
+    test("consuming no newlines increases the column but not the line", () {
+      scanner.scan('foo');
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(3));
+    });
+
+    test("consuming a newline resets the column and increases the line", () {
+      scanner.expect('foo\nba');
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(2));
+    });
+
+    test("consuming multiple newlines resets the column and increases the line",
+        () {
+      scanner.expect('foo\nbar\nb');
+      expect(scanner.line, equals(2));
+      expect(scanner.column, equals(1));
+    });
+  });
+
+  group("readChar()", () {
+    test("on a non-newline character increases the column but not the line",
+        () {
+      scanner.readChar();
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(1));
+    });
+
+    test("consuming a newline resets the column and increases the line", () {
+      scanner.expect('foo');
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(3));
+
+      scanner.readChar();
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(0));
+    });
+  });
+
+  group("position=", () {
+    test("forward through newlines sets the line and column", () {
+      scanner.position = 9; // "foo\nbar\nb"
+      expect(scanner.line, equals(2));
+      expect(scanner.column, equals(1));
+    });
+
+    test("forward through no newlines sets the column", () {
+      scanner.position = 2; // "fo"
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(2));
+    });
+
+    test("backward through newlines sets the line and column", () {
+      scanner.scan("foo\nbar\nbaz");
+      scanner.position = 2; // "fo"
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(2));
+    });
+
+    test("backward through no newlines sets the column", () {
+      scanner.scan("foo\nbar\nbaz");
+      scanner.position = 9; // "foo\nbar\nb"
+      expect(scanner.line, equals(2));
+      expect(scanner.column, equals(1));
+    });
+  });
+
+  test("state= restores the line, column, and position", () {
+    scanner.scan('foo\nb');
+    var state = scanner.state;
+
+    scanner.scan('ar\nba');
+    scanner.state = state;
+    expect(scanner.rest, equals('ar\nbaz'));
+    expect(scanner.line, equals(1));
+    expect(scanner.column, equals(1));
+  });
+
+  test("state= rejects a foreign state", () {
+    scanner.scan('foo\nb');
+
+    expect(() => new LineScanner(scanner.string).state = scanner.state,
+        throwsArgumentError);
+  });
+}
diff --git a/pkg/string_scanner/test/span_scanner_test.dart b/pkg/string_scanner/test/span_scanner_test.dart
new file mode 100644
index 0000000..93ba0b6
--- /dev/null
+++ b/pkg/string_scanner/test/span_scanner_test.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 string_scanner.span_scanner_test;
+
+import 'package:string_scanner/string_scanner.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  var scanner;
+  setUp(() {
+    scanner = new SpanScanner('foo\nbar\nbaz', 'source');
+  });
+
+  test("tracks the span for the last match", () {
+    scanner.scan('fo');
+    scanner.scan('o\nba');
+
+    var span = scanner.lastSpan;
+    expect(span.start.offset, equals(2));
+    expect(span.start.line, equals(0));
+    expect(span.start.column, equals(2));
+    expect(span.start.sourceUrl, equals('source'));
+
+    expect(span.end.offset, equals(6));
+    expect(span.end.line, equals(1));
+    expect(span.end.column, equals(2));
+    expect(span.start.sourceUrl, equals('source'));
+
+    expect(span.text, equals('o\nba'));
+  });
+
+  test(".spanFrom() returns a span from a previous state", () {
+    scanner.scan('fo');
+    var state = scanner.state;
+    scanner.scan('o\nba');
+    scanner.scan('r\nba');
+
+    var span = scanner.spanFrom(state);
+    expect(span.text, equals('o\nbar\nba'));
+  });
+
+  test(".emptySpan returns an empty span at the current location", () {
+    scanner.scan('foo\nba');
+
+    var span = scanner.emptySpan;
+    expect(span.start.offset, equals(6));
+    expect(span.start.line, equals(1));
+    expect(span.start.column, equals(2));
+    expect(span.start.sourceUrl, equals('source'));
+
+    expect(span.end.offset, equals(6));
+    expect(span.end.line, equals(1));
+    expect(span.end.column, equals(2));
+    expect(span.start.sourceUrl, equals('source'));
+
+    expect(span.text, equals(''));
+  });
+}
diff --git a/pkg/string_scanner/test/string_scanner_test.dart b/pkg/string_scanner/test/string_scanner_test.dart
index 0cab627..6144bf9 100644
--- a/pkg/string_scanner/test/string_scanner_test.dart
+++ b/pkg/string_scanner/test/string_scanner_test.dart
@@ -31,6 +31,18 @@
       expect(scanner.position, equals(0));
     });
 
+    test("readChar fails and doesn't change the state", () {
+      expect(scanner.readChar, throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("peekChar returns null and doesn't change the state", () {
+      expect(scanner.peekChar(), isNull);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
     test("scan returns false and doesn't change the state", () {
       expect(scanner.scan(new RegExp('.')), isFalse);
       expect(scanner.lastMatch, isNull);
@@ -85,6 +97,24 @@
       expect(scanner.position, equals(0));
     });
 
+    test('readChar returns the first character and moves forward', () {
+      expect(scanner.readChar(), equals(0x66));
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(1));
+    });
+
+    test('peekChar returns the first character', () {
+      expect(scanner.peekChar(), equals(0x66));
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test('peekChar with an argument returns the nth character', () {
+      expect(scanner.peekChar(4), equals(0x62));
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
     test("a matching scan returns true and changes the state", () {
       expect(scanner.scan(new RegExp('f(..)')), isTrue);
       expect(scanner.lastMatch[1], equals('oo'));
@@ -200,6 +230,18 @@
       expect(scanner.position, equals(7));
     });
 
+    test("readChar fails and doesn't change the state", () {
+      expect(scanner.readChar, throwsFormatException);
+      expect(scanner.lastMatch, isNotNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test("peekChar returns null and doesn't change the state", () {
+      expect(scanner.peekChar(), isNull);
+      expect(scanner.lastMatch, isNotNull);
+      expect(scanner.position, equals(7));
+    });
+
     test("scan returns false and sets lastMatch to null", () {
       expect(scanner.scan(new RegExp('.')), isFalse);
       expect(scanner.lastMatch, isNull);
diff --git a/pkg/string_scanner/test/utils.dart b/pkg/string_scanner/test/utils.dart
index eee93d8..3de601c 100644
--- a/pkg/string_scanner/test/utils.dart
+++ b/pkg/string_scanner/test/utils.dart
@@ -4,14 +4,15 @@
 
 library string_scanner.test.utils;
 
+import 'package:string_scanner/string_scanner.dart';
 import 'package:unittest/unittest.dart';
 
 /// Returns a matcher that asserts that a closure throws a [FormatException]
 /// with the given [message].
-Matcher throwsFormattedError(String message) {
+Matcher throwsStringScannerException(String text) {
   return throwsA(predicate((error) {
-    expect(error, isFormatException);
-    expect(error.message, equals(message));
+    expect(error, new isInstanceOf<StringScannerException>());
+    expect(error.span.text, equals(text));
     return true;
   }));
 }
diff --git a/pkg/third_party/html5lib/CHANGELOG.md b/pkg/third_party/html5lib/CHANGELOG.md
index dd64e89..7c7ebb0 100644
--- a/pkg/third_party/html5lib/CHANGELOG.md
+++ b/pkg/third_party/html5lib/CHANGELOG.md
@@ -3,6 +3,9 @@
 This file contains highlights of what changes on each version of the html5lib
 package.
 
+#### Pub version 0.10.0+1
+  * use a more recent source_maps version.
+
 #### Pub version 0.10.0
   * fix how document fragments are added in NodeList.add/addAll/insertAll.
 
diff --git a/pkg/third_party/html5lib/lib/parser.dart b/pkg/third_party/html5lib/lib/parser.dart
index 721985a..aca5661 100644
--- a/pkg/third_party/html5lib/lib/parser.dart
+++ b/pkg/third_party/html5lib/lib/parser.dart
@@ -3354,7 +3354,7 @@
 
   String toString() {
     var res = span.getLocationMessage(message);
-    return span.sourceUrl == null ? 'ParserError$res' : res;
+    return span.sourceUrl == null ? 'ParserError on $res' : 'On $res';
   }
 }
 
diff --git a/pkg/third_party/html5lib/pubspec.yaml b/pkg/third_party/html5lib/pubspec.yaml
index 56d613b..e4a2d9a 100644
--- a/pkg/third_party/html5lib/pubspec.yaml
+++ b/pkg/third_party/html5lib/pubspec.yaml
@@ -1,5 +1,5 @@
 name: html5lib
-version: 0.11.0
+version: 0.11.0+1
 author: Dart Team <misc@dartlang.org>
 description: A library for working with HTML documents.
 homepage: http://pub.dartlang.org/packages/html5lib
@@ -7,7 +7,7 @@
   sdk: '>=1.2.0 <2.0.0'
 dependencies:
   csslib: '>=0.10.0 <0.11.0'
-  source_maps: '>=0.9.0 <0.10.0'
+  source_maps: '>=0.9.1 <0.10.0'
   utf: '>=0.9.0 <0.10.0'
 dev_dependencies:
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/third_party/html5lib/test/parser_feature_test.dart b/pkg/third_party/html5lib/test/parser_feature_test.dart
index b21480d..e5b036f 100644
--- a/pkg/third_party/html5lib/test/parser_feature_test.dart
+++ b/pkg/third_party/html5lib/test/parser_feature_test.dart
@@ -53,7 +53,7 @@
     expect(error.span.text, '<!DOCTYPE html>');
 
     expect(error.toString(), '''
-ParseError:4:3: Unexpected DOCTYPE. Ignored.
+On line 4, column 3 of ParseError: Unexpected DOCTYPE. Ignored.
   <!DOCTYPE html>
   ^^^^^^^^^^^^^^^''');
   });
@@ -245,7 +245,7 @@
     expect(parser.errors[0].message,
         'Unexpected non-space characters. Expected DOCTYPE.');
     expect(parser.errors[0].toString(),
-        'ParserError:1:4: Unexpected non-space characters. '
+        'ParserError on line 1, column 4: Unexpected non-space characters. '
         'Expected DOCTYPE.');
   });
 
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index 2e63db0..8298b97 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -35,6 +35,7 @@
   V(Directory_List, 3)                                                         \
   V(File_Open, 2)                                                              \
   V(File_Exists, 1)                                                            \
+  V(File_GetFD, 1)                                                             \
   V(File_Close, 1)                                                             \
   V(File_ReadByte, 1)                                                          \
   V(File_WriteByte, 2)                                                         \
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 4175eb5..ed53fab 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -542,6 +542,18 @@
   DISALLOW_COPY_AND_ASSIGN(CObjectExternalUint8Array);
 };
 
+
+class ScopedBlockingCall {
+ public:
+  ScopedBlockingCall() {
+    Dart_IsolateBlocked();
+  }
+
+  ~ScopedBlockingCall() {
+    Dart_IsolateUnblocked();
+  }
+};
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index e4548a5..a9b13fb 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -111,6 +111,13 @@
 }
 
 
+void FUNCTION_NAME(File_GetFD)(Dart_NativeArguments args) {
+  File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
+  ASSERT(file != NULL);
+  Dart_SetReturnValue(args, Dart_NewInteger(file->GetFD()));
+}
+
+
 void FUNCTION_NAME(File_ReadByte)(Dart_NativeArguments args) {
   File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
   ASSERT(file != NULL);
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index fd6427b..c27cebe 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -73,6 +73,8 @@
 
   ~File();
 
+  intptr_t GetFD();
+
   // Read/Write attempt to transfer num_bytes to/from buffer. It returns
   // the number of bytes read/written.
   int64_t Read(void* buffer, int64_t num_bytes);
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 6b5b024..410fa0f 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -65,6 +65,11 @@
 }
 
 
+intptr_t File::GetFD() {
+  return handle_->fd();
+}
+
+
 bool File::IsClosed() {
   return handle_->fd() == kClosedFd;
 }
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index f8c6674..657eccda 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -63,6 +63,11 @@
 }
 
 
+intptr_t File::GetFD() {
+  return handle_->fd();
+}
+
+
 bool File::IsClosed() {
   return handle_->fd() == kClosedFd;
 }
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 9b0b2ad..830b3c4 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -65,6 +65,11 @@
 }
 
 
+intptr_t File::GetFD() {
+  return handle_->fd();
+}
+
+
 bool File::IsClosed() {
   return handle_->fd() == kClosedFd;
 }
diff --git a/runtime/bin/file_patch.dart b/runtime/bin/file_patch.dart
index 30dda6e..e41f2f5 100644
--- a/runtime/bin/file_patch.dart
+++ b/runtime/bin/file_patch.dart
@@ -24,6 +24,7 @@
 
 patch class _RandomAccessFile {
   /* patch */ static int _close(int id) native "File_Close";
+  /* patch */ static int _getFD(int id) native "File_GetFD";
   /* patch */ static _readByte(int id) native "File_ReadByte";
   /* patch */ static _read(int id, int bytes) native "File_Read";
   /* patch */ static _readInto(int id, List<int> buffer, int start, int end)
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index bbba55b..0e4263b 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -59,6 +59,11 @@
 }
 
 
+intptr_t File::GetFD() {
+  return handle_->fd();
+}
+
+
 bool File::IsClosed() {
   return handle_->fd() == kClosedFd;
 }
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index e394e36..13b7938 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -85,7 +85,8 @@
 
 
 static bool has_version_option = false;
-static bool ProcessVersionOption(const char* arg) {
+static bool ProcessVersionOption(const char* arg,
+                                 CommandLineOptions* vm_options) {
   if (*arg != '\0') {
     return false;
   }
@@ -95,7 +96,7 @@
 
 
 static bool has_help_option = false;
-static bool ProcessHelpOption(const char* arg) {
+static bool ProcessHelpOption(const char* arg, CommandLineOptions* vm_options) {
   if (*arg != '\0') {
     return false;
   }
@@ -105,7 +106,8 @@
 
 
 static bool has_verbose_option = false;
-static bool ProcessVerboseOption(const char* arg) {
+static bool ProcessVerboseOption(const char* arg,
+                                 CommandLineOptions* vm_options) {
   if (*arg != '\0') {
     return false;
   }
@@ -114,7 +116,8 @@
 }
 
 
-static bool ProcessBreakpointOption(const char* funcname) {
+static bool ProcessBreakpointOption(const char* funcname,
+                                    CommandLineOptions* vm_options) {
   ASSERT(funcname != NULL);
   if (*funcname == '\0') {
     return false;
@@ -124,7 +127,8 @@
 }
 
 
-static bool ProcessPackageRootOption(const char* arg) {
+static bool ProcessPackageRootOption(const char* arg,
+                                     CommandLineOptions* vm_options) {
   ASSERT(arg != NULL);
   if (*arg == '\0' || *arg == '-') {
     return false;
@@ -182,7 +186,8 @@
 }
 
 
-static bool ProcessEnvironmentOption(const char* arg) {
+static bool ProcessEnvironmentOption(const char* arg,
+                                     CommandLineOptions* vm_options) {
   ASSERT(arg != NULL);
   if (*arg == '\0') {
     // Ignore empty -D option.
@@ -220,7 +225,8 @@
 }
 
 
-static bool ProcessCompileAllOption(const char* arg) {
+static bool ProcessCompileAllOption(const char* arg,
+                                    CommandLineOptions* vm_options) {
   ASSERT(arg != NULL);
   if (*arg != '\0') {
     return false;
@@ -229,7 +235,8 @@
   return true;
 }
 
-static bool ProcessDebugOption(const char* option_value) {
+static bool ProcessDebugOption(const char* option_value,
+                               CommandLineOptions* vm_options) {
   ASSERT(option_value != NULL);
   if (!ExtractPortAndIP(option_value, &debug_port, &debug_ip,
                         DEFAULT_DEBUG_PORT, DEFAULT_DEBUG_IP)) {
@@ -244,7 +251,8 @@
 }
 
 
-static bool ProcessPrintScriptOption(const char* arg) {
+static bool ProcessPrintScriptOption(const char* arg,
+                                     CommandLineOptions* vm_options) {
   ASSERT(arg != NULL);
   if (*arg != '\0') {
     return false;
@@ -254,7 +262,8 @@
 }
 
 
-static bool ProcessGenScriptSnapshotOption(const char* filename) {
+static bool ProcessGenScriptSnapshotOption(const char* filename,
+                                           CommandLineOptions* vm_options) {
   if (filename != NULL && strlen(filename) != 0) {
     // Ensure that are already running using a full snapshot.
     if (snapshot_buffer == NULL) {
@@ -275,7 +284,8 @@
 }
 
 
-static bool ProcessEnableVmServiceOption(const char* option_value) {
+static bool ProcessEnableVmServiceOption(const char* option_value,
+                                         CommandLineOptions* vm_options) {
   ASSERT(option_value != NULL);
 
   if (!ExtractPortAndIP(option_value,
@@ -292,8 +302,31 @@
   return true;
 }
 
+
+static bool ProcessObserveOption(const char* option_value,
+                                 CommandLineOptions* vm_options) {
+  ASSERT(option_value != NULL);
+
+  if (!ExtractPortAndIP(option_value,
+                        &vm_service_server_port,
+                        &vm_service_server_ip,
+                        DEFAULT_VM_SERVICE_SERVER_PORT,
+                        DEFAULT_VM_SERVICE_SERVER_IP)) {
+    Log::PrintErr("unrecognized --observe option syntax. "
+                  "Use --observe[:<port number>[/<IPv4 address>]]\n");
+    return false;
+  }
+
+  start_vm_service = true;
+
+  vm_options->AddArgument("--pause-isolates-on-exit");
+  return true;
+}
+
+
 bool trace_debug_protocol = false;
-static bool ProcessTraceDebugProtocolOption(const char* arg) {
+static bool ProcessTraceDebugProtocolOption(const char* arg,
+                                            CommandLineOptions* vm_options) {
   if (*arg != '\0') {
     return false;
   }
@@ -304,7 +337,7 @@
 
 static struct {
   const char* option_name;
-  bool (*process)(const char* option);
+  bool (*process)(const char* option, CommandLineOptions* vm_options);
 } main_options[] = {
   // Standard options shared with dart2js.
   { "--version", ProcessVersionOption },
@@ -321,19 +354,21 @@
   { "--snapshot=", ProcessGenScriptSnapshotOption },
   { "--print-script", ProcessPrintScriptOption },
   { "--enable-vm-service", ProcessEnableVmServiceOption },
+  { "--observe", ProcessObserveOption },
   { "--trace-debug-protocol", ProcessTraceDebugProtocolOption },
   { NULL, NULL }
 };
 
 
-static bool ProcessMainOptions(const char* option) {
+static bool ProcessMainOptions(const char* option,
+                               CommandLineOptions* vm_options) {
   int i = 0;
   const char* name = main_options[0].option_name;
   int option_length = strlen(option);
   while (name != NULL) {
     int length = strlen(name);
     if ((option_length >= length) && (strncmp(option, name, length) == 0)) {
-      if (main_options[i].process(option + length)) {
+      if (main_options[i].process(option + length, vm_options)) {
         return true;
       }
     }
@@ -382,16 +417,18 @@
 
   // Parse out the vm options.
   while (i < argc) {
-    if (ProcessMainOptions(argv[i])) {
+    if (ProcessMainOptions(argv[i], vm_options)) {
       i++;
     } else {
       // Check if this flag is a potentially valid VM flag.
       const char* kChecked = "-c";
       const char* kPackageRoot = "-p";
       if (strncmp(argv[i], kPackageRoot, strlen(kPackageRoot)) == 0) {
-        if (!ProcessPackageRootOption(argv[i] + strlen(kPackageRoot))) {
+        if (!ProcessPackageRootOption(argv[i] + strlen(kPackageRoot),
+                                      vm_options)) {
           i++;
-          if ((argv[i] == NULL) || !ProcessPackageRootOption(argv[i])) {
+          if ((argv[i] == NULL) ||
+               !ProcessPackageRootOption(argv[i], vm_options)) {
             Log::PrintErr("Invalid option specification : '%s'\n", argv[i - 1]);
             i++;
             break;
diff --git a/runtime/bin/net/nss.gyp b/runtime/bin/net/nss.gyp
index 0a3f777..c811f31 100644
--- a/runtime/bin/net/nss.gyp
+++ b/runtime/bin/net/nss.gyp
@@ -75,6 +75,11 @@
           'NSS_USE_64',
         ],
       },
+      'Dart_arm64_Base': {
+        'defines': [
+          'NSS_USE_64',
+        ],
+      },
     },
     'conditions': [
       ['OS=="win"', {
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
index 5d392d2..a17ec16 100644
--- a/runtime/bin/process.cc
+++ b/runtime/bin/process.cc
@@ -7,6 +7,7 @@
 #include "bin/platform.h"
 #include "bin/process.h"
 #include "bin/socket.h"
+#include "bin/utils.h"
 
 #include "include/dart_api.h"
 
@@ -227,6 +228,7 @@
 
 
 void FUNCTION_NAME(Process_Sleep)(Dart_NativeArguments args) {
+  ScopedBlockingCall blocker;
   int64_t milliseconds = 0;
   // Ignore result if passing invalid argument and just set exit code to 0.
   DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &milliseconds);
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 970bb65..a165f93 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -157,13 +157,22 @@
 }
 
 
-class _ProcessImpl extends NativeFieldWrapperClass1 implements Process {
+// The NativeFieldWrapperClass1 can not be used with a mixin, due to missing
+// implicit constructor.
+class _ProcessImplNativeWrapper extends NativeFieldWrapperClass1 {}
+
+class _ProcessImpl extends _ProcessImplNativeWrapper with _ServiceObject
+    implements Process {
+  // Use default Map so we keep order.
+  static Map<int, _ProcessImpl> _processes = new Map<int, _ProcessImpl>();
+
   _ProcessImpl(String path,
                List<String> arguments,
                String this._workingDirectory,
                Map<String, String> environment,
                bool includeParentEnvironment,
-               bool runInShell) {
+               bool runInShell) : super() {
+    _processes[_serviceId] = this;
     if (runInShell) {
       arguments = _getShellArguments(path, arguments);
       path = _getShellCommand();
@@ -221,15 +230,50 @@
 
     // stdin going to process.
     _stdin = new _StdSink(new _Socket._writePipe());
+    _stdin._sink._owner = this;
     // stdout coming from process.
     _stdout = new _StdStream(new _Socket._readPipe());
+    _stdout._stream._owner = this;
     // stderr coming from process.
     _stderr = new _StdStream(new _Socket._readPipe());
+    _stderr._stream._owner = this;
     _exitHandler = new _Socket._readPipe();
     _ended = false;
     _started = false;
   }
 
+  String get _serviceTypePath => 'io/processes';
+  String get _serviceTypeName => 'Process';
+
+  Map _toJSON(bool ref) {
+    var r = {
+      'id': _servicePath,
+      'type': _serviceType(ref),
+      'name': '$_path',
+      'user_name': '$_path',
+      'pid': '$pid',
+      'arguments': _arguments.join(' '),
+    };
+    if (ref) {
+      return r;
+    }
+    r['started'] = _started;
+    r['ended'] = _ended;
+    r['path'] = _path;
+    r['environment'] = _environment;
+    r['workingDirectory'] = _workingDirectory == null ? '.' : _workingDirectory;
+    if (_stdin._sink._nativeSocket.owner != null) {
+      r['stdin'] = _stdin._sink._nativeSocket._toJSON(true);
+    }
+    if (_stdout._stream._nativeSocket.owner != null) {
+      r['stdout'] = _stdout._stream._nativeSocket._toJSON(true);
+    }
+    if (_stderr._stream._nativeSocket.owner != null) {
+      r['stderr'] = _stderr._stream._nativeSocket._toJSON(true);
+    }
+    return r;
+  }
+
   static String _getShellCommand() {
     if (Platform.isWindows) {
       return 'cmd.exe';
@@ -338,11 +382,6 @@
                                  status._errorCode));
         return;
       }
-      // Reset values which are no longer needed.
-      _path = null;
-      _arguments = null;
-      _workingDirectory = null;
-      _environment = null;
 
       _started = true;
 
@@ -365,6 +404,7 @@
           _exitCode.complete(exitCode(exitDataBuffer));
           // Kill stdin, helping hand if the user forgot to do it.
           _stdin._sink.destroy();
+          _processes.remove(_serviceId);
         }
 
         exitDataBuffer.setRange(exitDataRead, exitDataRead + data.length, data);
@@ -397,11 +437,6 @@
                                  status._errorMessage,
                                  status._errorCode);
     }
-    // Reset values which are no longer needed.
-    _path = null;
-    _arguments = null;
-    _workingDirectory = null;
-    _environment = null;
 
     var result = _wait(
         _stdin._sink._nativeSocket,
diff --git a/runtime/bin/service_object_patch.dart b/runtime/bin/service_object_patch.dart
index b670598..b714971 100644
--- a/runtime/bin/service_object_patch.dart
+++ b/runtime/bin/service_object_patch.dart
@@ -5,17 +5,20 @@
 
 final Map _servicePathMap = {
   'http' : {
-    'servers' : _httpServersServiceObject
-  }
+    'servers' : _httpServersServiceObject,
+  },
+  'sockets' : _socketsServiceObject,
+  'websockets' : _webSocketsServiceObject,
+  'file' : {
+    'randomaccessfiles' : _randomAccessFilesServiceObject
+  },
+  'processes' : _processesServiceObject,
 };
 
 String _serviceObjectHandler(List<String> paths,
                              List<String> keys,
                              List<String> values) {
   assert(keys.length == values.length);
-  badPath() {
-    throw "Invalid path '${paths.join("/")}'";
-  }
   if (paths.isEmpty) {
     return JSON.encode(_ioServiceObject());
   }
@@ -26,7 +29,8 @@
     i++;
   } while (i < paths.length && current is Map);
   if (current is! Function) {
-    badPath();
+    return JSON.encode(_makeServiceError('Unrecognized path', paths, keys,
+                                         values));
   }
   var query = new Map();
   for (int i = 0; i < keys.length; i++) {
@@ -35,6 +39,27 @@
   return JSON.encode(current(paths.sublist(i)));
 }
 
+Map _makeServiceError(String message,
+                      List<String> paths,
+                      List<String> keys,
+                      List<String> values,
+                      [String kind]) {
+  var error = {
+    'type': 'Error',
+    'id': '',
+    'message': message,
+    'request': {
+      'arguments': paths,
+      'option_keys': keys,
+      'option_values': values,
+    }
+  };
+  if (kind != null) {
+    error['kind'] = kind;
+  }
+  return error;
+}
+
 Map _ioServiceObject() {
   return {
     'id': 'io',
@@ -59,3 +84,67 @@
         .map((server) => server._toJSON(true)).toList(),
   };
 }
+
+Map _socketsServiceObject(args) {
+  if (args.length == 1) {
+    var socket = _NativeSocket._sockets[int.parse(args.first)];
+    if (socket == null) {
+      return {};
+    }
+    return socket._toJSON(false);
+  }
+  return {
+    'id': 'io/sockets',
+    'type': 'SocketList',
+    'members': _NativeSocket._sockets.values
+        .map((socket) => socket._toJSON(true)).toList(),
+  };
+}
+
+Map _webSocketsServiceObject(args) {
+  if (args.length == 1) {
+    var webSocket = _WebSocketImpl._webSockets[int.parse(args.first)];
+    if (webSocket == null) {
+      return {};
+    }
+    return webSocket._toJSON(false);
+  }
+  return {
+    'id': 'io/websockets',
+    'type': 'WebSocketList',
+    'members': _WebSocketImpl._webSockets.values
+        .map((webSocket) => webSocket._toJSON(true)).toList(),
+  };
+}
+
+Map _randomAccessFilesServiceObject(args) {
+  if (args.length == 1) {
+    var raf = _RandomAccessFile._files[int.parse(args.first)];
+    if (raf == null) {
+      return {};
+    }
+    return raf._toJSON(false);
+  }
+  return {
+    'id': 'io/file/randomaccessfiles',
+    'type': 'RandomAccessFileList',
+    'members': _RandomAccessFile._files.values
+        .map((raf) => raf._toJSON(true)).toList(),
+  };
+}
+
+Map _processesServiceObject(args) {
+  if (args.length == 1) {
+    var process = _ProcessImpl._processes[int.parse(args.first)];
+    if (process == null) {
+      return {};
+    }
+    return process._toJSON(false);
+  }
+  return {
+    'id': 'io/processes',
+    'type': 'ProcessList',
+    'members': _ProcessImpl._processes.values
+        .map((p) => p._toJSON(true)).toList(),
+  };
+}
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 7445562..4f28550 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -207,133 +207,13 @@
 }
 
 
-class _Rate {
-  final int buckets;
-  final data;
-  int lastValue = 0;
-  int nextBucket = 0;
-
-  _Rate(int buckets) : buckets = buckets, data = new List.filled(buckets, 0);
-
-  void update(int value) {
-    data[nextBucket] = value - lastValue;
-    lastValue = value;
-    nextBucket = (nextBucket + 1) % buckets;
-  }
-
-  int get rate {
-    int sum = data.fold(0, (prev, element) => prev + element);
-    return sum ~/ buckets;
-  }
-}
-
-// Statics information for the observatory.
-class _SocketStat {
-  _Rate readRate = new _Rate(5);
-  _Rate writeRate = new _Rate(5);
-
-  void update(_NativeSocket socket) {
-    readRate.update(socket.totalRead);
-    writeRate.update(socket.totalWritten);
-  }
-}
-
-class _SocketsObservatory {
-  static int socketCount = 0;
-  static Map sockets = new Map<_NativeSocket, _SocketStat>();
-  static Timer timer;
-
-  static add(_NativeSocket socket) {
-    if (socketCount == 0) startTimer();
-    sockets[socket] = new _SocketStat();
-    socketCount++;
-  }
-
-  static remove(_NativeSocket socket) {
-    _SocketStat stats = sockets.remove(socket);
-    assert(stats != null);
-    socketCount--;
-    if (socketCount == 0) stopTimer();
-  }
-
-  static update(_) {
-    sockets.forEach((socket, stat) {
-      stat.update(socket);
-    });
-  }
-
-  static startTimer() {
-    if (timer != null) return;
-    // TODO(sgjesse): Enable the rate timer.
-    // timer = new Timer.periodic(new Duration(seconds: 1), update);
-  }
-
-  static stopTimer() {
-    if (timer == null) return;
-    timer.cancel();
-    timer = null;
-  }
-
-  static String generateResponse() {
-    var response = new Map();
-    response['type'] = 'SocketList';
-    var members = new List();
-    response['members'] = members;
-    sockets.forEach((socket, stat) {
-      var kind =
-          socket.isListening ? "LISTENING" :
-          socket.isPipe ? "PIPE" :
-          socket.isInternal ? "INTERNAL" : "NORMAL";
-      var protocol =
-          socket.isTcp ? "tcp" :
-          socket.isUdp ? "udp" : "";
-      var localAddress;
-      var localPort;
-      var remoteAddress;
-      var remotePort;
-      try {
-        localAddress = socket.address.address;
-      } catch (e) {
-        localAddress = "n/a";
-      }
-      try {
-        localPort = socket.port;
-      } catch (e) {
-        localPort = "n/a";
-      }
-      try {
-        remoteAddress = socket.remoteAddress.address;
-      } catch (e) {
-        remoteAddress = "n/a";
-      }
-      try {
-        remotePort = socket.remotePort;
-      } catch (e) {
-        remotePort = "n/a";
-      }
-      members.add({'type': 'Socket', 'kind': kind, 'protocol': protocol,
-                   'localAddress': localAddress, 'localPort': localPort,
-                   'remoteAddress': remoteAddress, 'remotePort': remotePort,
-                   'totalRead': socket.totalRead,
-                   'totalWritten': socket.totalWritten,
-                   'readPerSec': stat.readRate.rate,
-                   'writePerSec': stat.writeRate.rate});
-    });
-    return JSON.encode(response);;
-  }
-
-  static String toJSON() {
-    try {
-      return generateResponse();
-    } catch (e, s) {
-      return '{"type":"Error","text":"$e","stacktrace":"$s"}';
-    }
-  }
-}
+// The NativeFieldWrapperClass1 can not be used with a mixin, due to missing
+// implicit constructor.
+class _NativeSocketNativeWrapper extends NativeFieldWrapperClass1 {}
 
 
 // The _NativeSocket class encapsulates an OS socket.
-class _NativeSocket extends NativeFieldWrapperClass1 {
+class _NativeSocket extends _NativeSocketNativeWrapper with _ServiceObject {
   // Bit flags used when communicating between the eventhandler and
   // dart code. The EVENT flags are used to indicate events of
   // interest when sending a message from dart code to the
@@ -393,6 +273,9 @@
   static const int NORMAL_TOKEN_BATCH_SIZE = 8;
   static const int LISTENING_TOKEN_BATCH_SIZE = 2;
 
+  // Use default Map so we keep order.
+  static Map<int, _NativeSocket> _sockets = new Map<int, _NativeSocket>();
+
   // Socket close state
   bool isClosed = false;
   bool isClosing = false;
@@ -424,9 +307,20 @@
   bool writeEventIssued = false;
   bool writeAvailable = false;
 
+  static final Stopwatch sw = new Stopwatch()..start();
   // Statistics.
   int totalRead = 0;
   int totalWritten = 0;
+  int readCount = 0;
+  int writeCount = 0;
+  double lastRead;
+  double lastWrite;
+
+  // The owner object is the object that the Socket is being used by, e.g.
+  // a HttpServer, a WebSocket connection, a process pipe, etc.
+  Object owner;
+
+  static double get timestamp => sw.elapsedMicroseconds / 1000000.0;
 
   static Future<List<InternetAddress>> lookup(
       String host, {InternetAddressType type: InternetAddressType.ANY}) {
@@ -600,7 +494,7 @@
 
   _NativeSocket.normal() : typeFlags = TYPE_NORMAL_SOCKET | TYPE_TCP_SOCKET;
 
-  _NativeSocket.listen() : typeFlags = TYPE_LISTENING_SOCKET | TYPE_TCP_SOCKET;
+  _NativeSocket.listen() :  typeFlags = TYPE_LISTENING_SOCKET | TYPE_TCP_SOCKET;
 
   _NativeSocket.pipe() : typeFlags = TYPE_PIPE;
 
@@ -632,6 +526,8 @@
       available -= result.length;
       totalRead += result.length;
     }
+    readCount++;
+    lastRead = timestamp;
     return result;
   }
 
@@ -650,7 +546,10 @@
       } else {
         available -= result.data.length;
       }
+      totalRead += result.data.length;
     }
+    readCount++;
+    lastRead = timestamp;
     return result;
   }
 
@@ -690,6 +589,8 @@
     // Negate the result, as stated above.
     if (result < 0) result = -result;
     totalWritten += result;
+    writeCount++;
+    lastWrite = timestamp;
     return result;
   }
 
@@ -706,6 +607,9 @@
       scheduleMicrotask(() => reportError(result, "Send failed"));
       result = 0;
     }
+    totalWritten += result;
+    writeCount++;
+    lastWrite = timestamp;
     return result;
   }
 
@@ -721,6 +625,7 @@
     socket.localPort = localPort;
     socket.address = address;
     totalRead += 1;
+    lastRead = timestamp;
     return socket;
   }
 
@@ -943,7 +848,7 @@
     assert(!isClosed);
     if (eventPort == null) {
       eventPort = new RawReceivePort(multiplex);
-      _SocketsObservatory.add(this);
+      _sockets[_serviceId] = this;
     }
   }
 
@@ -951,7 +856,10 @@
     assert(eventPort != null);
     eventPort.close();
     eventPort = null;
-    _SocketsObservatory.remove(this);
+    _sockets.remove(_serviceId);
+    // Now that we don't track this Socket anymore, we can clear the owner
+    // field.
+    owner = null;
   }
 
   // Check whether this is an error response from a native port call.
@@ -1053,6 +961,124 @@
     if (result is OSError) throw result;
   }
 
+  String get _serviceTypePath => 'io/sockets';
+  String get _serviceTypeName => 'Socket';
+
+  String _JSONKind() {
+    return isListening ? "Listening" :
+           isPipe ? "Pipe" :
+           isInternal ? "Internal" : "Normal";
+  }
+
+  Map _toJSONPipe(bool ref) {
+    var name = 'Anonymous Pipe';
+    var r = {
+      'id': _servicePath,
+      'type': _serviceType(ref),
+      'name': name,
+      'user_name': name,
+      'kind': _JSONKind(),
+    };
+    if (ref) {
+      return r;
+    }
+    r['readClosed'] = isClosedRead;
+    r['writeClosed'] = isClosedWrite;
+    r['closing'] = isClosing;
+    r['fd'] = nativeGetSocketId();
+    if (owner != null) {
+      r['owner'] = owner._toJSON(true);
+    }
+    return r;
+  }
+
+  Map _toJSONInternal(bool ref) {
+    var name = 'Internal';
+    var r = {
+      'id': _servicePath,
+      'type': _serviceType(ref),
+      'name': name,
+      'user_name': name,
+      'kind': _JSONKind(),
+    };
+    if (ref) {
+      return r;
+    }
+    r['closing'] = isClosing;
+    r['fd'] = nativeGetSocketId();
+    if (owner != null) {
+      r['owner'] = owner._toJSON(true);
+    }
+    return r;
+  }
+
+  Map _toJSONNetwork(bool ref) {
+    var name = '${address.host}:$port';
+    if (isTcp && !isListening) name += " <-> ${remoteAddress.host}:$remotePort";
+    var r = {
+      'id': _servicePath,
+      'type': _serviceType(ref),
+      'name': name,
+      'user_name': name,
+      'kind': _JSONKind(),
+    };
+    if (ref) {
+      return r;
+    }
+    var protocol = isTcp ? "TCP" : isUdp ? "UDP" : null;
+    var localAddress;
+    var localPort;
+    var rAddress;
+    var rPort;
+    try {
+      localAddress = address.address;
+    } catch (e) { }
+    try {
+      localPort = port;
+    } catch (e) { }
+    try {
+      rAddress = this.remoteAddress.address;
+    } catch (e) { }
+    try {
+      rPort = remotePort;
+    } catch (e) { }
+    r['localAddress'] = localAddress;
+    r['localPort'] = localPort;
+    r['remoteAddress'] = rAddress;
+    r['remotePort'] = rPort;
+    r['protocol'] = protocol;
+    r['readClosed'] = isClosedRead;
+    r['writeClosed'] = isClosedWrite;
+    r['closing'] = isClosing;
+    r['listening'] = isListening;
+    r['fd'] = nativeGetSocketId();
+    if (owner != null) {
+      r['owner'] = owner._toJSON(true);
+    }
+    return r;
+  }
+
+  Map _toJSON(bool ref) {
+    var map;
+    if (isPipe) {
+      map =  _toJSONPipe(ref);
+    } else if (isInternal) {
+      map = _toJSONInternal(ref);
+    } else {
+      map = _toJSONNetwork(ref);
+    }
+    if (!ref) {
+      map['available'] = available;
+      map['totalRead'] = totalRead;
+      map['totalWritten'] = totalWritten;
+      map['readCount'] = totalWritten;
+      map['writeCount'] = writeCount;
+      map['lastRead'] = lastRead;
+      map['lastWrite'] = lastWrite;
+    }
+    return map;
+  }
+
   void nativeSetSocketId(int id) native "Socket_SetSocketId";
   nativeAvailable() native "Socket_Available";
   nativeRead(int len) native "Socket_Read";
@@ -1185,6 +1211,9 @@
     }
     return new _RawServerSocketReference(_referencePort.sendPort);
   }
+
+  Map _toJSON(bool ref) => _socket._toJSON(ref);
+  void set _owner(owner) { _socket.owner = owner; }
 }
 
 
@@ -1358,6 +1387,9 @@
       _socket.close();
     }
   }
+
+  Map _toJSON(bool ref) => _socket._toJSON(ref);
+  void set _owner(owner) { _socket.owner = owner; }
 }
 
 
@@ -1416,6 +1448,9 @@
   ServerSocketReference get reference {
     return new _ServerSocketReference(_socket.reference);
   }
+
+  Map _toJSON(bool ref) => _socket._toJSON(ref);
+  void set _owner(owner) { _socket._owner = owner; }
 }
 
 
@@ -1601,8 +1636,9 @@
   }
 
   int get port => _raw.port;
-  InternetAddress get remoteAddress => _raw.remoteAddress;
+  InternetAddress get address => _raw.address;
   int get remotePort => _raw.remotePort;
+  InternetAddress get remoteAddress => _raw.remoteAddress;
 
   Future _detachRaw() {
     _detachReady = new Completer();
@@ -1711,6 +1747,9 @@
       }
     }
   }
+
+  Map _toJSON(bool ref) => _raw._toJSON(ref);
+  void set _owner(owner) { _raw._owner = owner; }
 }
 
 
diff --git a/runtime/bin/stdio.cc b/runtime/bin/stdio.cc
index 916a3b8..6eb0113 100644
--- a/runtime/bin/stdio.cc
+++ b/runtime/bin/stdio.cc
@@ -18,6 +18,7 @@
 namespace bin {
 
 void FUNCTION_NAME(Stdin_ReadByte)(Dart_NativeArguments args) {
+  ScopedBlockingCall blocker;
   Dart_SetReturnValue(args, Dart_NewInteger(Stdin::ReadByte()));
 }
 
diff --git a/runtime/bin/vmservice/client/HACKING.txt b/runtime/bin/vmservice/client/HACKING.txt
index 006003b..6eee45e 100644
--- a/runtime/bin/vmservice/client/HACKING.txt
+++ b/runtime/bin/vmservice/client/HACKING.txt
@@ -10,25 +10,24 @@
 
 1. Open runtime/bin/vmservice/client in the Dart Editor
 2. Run pub upgrade
-3. Run pub serve in runtime/bin/vmservice/client
-4. Launch dart --enable-vm-service --pause-isolates-on-exit script.dart
-5. Connect to http://localhost:8080 in Dartium.
+3. Run dart --observe script.dart
+4. Run index.html in Dartium
 
 At this point you should see the initial Observatory UI and that
-it is communicating with the VM you launched in step 4.
+it is communicating with the VM you launched in step 3.
 
 Continue to develop and iterate until you're ready to upload your change
 for review. Upload your change and get an LGTM.
 
-6. Run pub build
-7. Run ./deploy.sh
+5. Run pub build
+6. Run ./deploy.sh
 
 At this point you should rebuild your VM and:
 
-8. Launch dart --enable-vm-service --pause-isolates-on-exit script.dart
+7. Launch dart --observe script.dart
 
 In a non-Dart enabled browser navigate to localhost:8181 and ensure
 that your feature works after being compiled to JavaScript.
 
-9. Commit your change
+8. Commit your change
 
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 564dd85..45640c8 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -28,14 +28,9 @@
 
 <!-- Teach dart2js about Shadow DOM polyfill objects. -->
 
-
-<!-- Bootstrap the user application in a new isolate. -->
-
-<!-- TODO(sigmund): replace boot.js by boot.dart (dartbug.com/18007)
-<script type="application/dart">export "package:polymer/boot.dart";</script>
- -->
 <script src="packages/polymer/src/js/use_native_dartium_shadowdom.js"></script><script src="packages/web_components/platform.js"></script>
 <!-- <link rel="import" href="../polymer-dev/polymer.html"> -->
+
 <script src="packages/polymer/src/js/polymer/polymer.js"></script><polymer-element name="polymer-body" extends="body">
 
   <script>
@@ -126,7 +121,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -294,6 +294,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style><script type="text/javascript" src="https://www.google.com/jsapi"></script>
   
   
@@ -335,6 +339,7 @@
   
   
   
+  
 
   
 
@@ -448,7 +453,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -616,6 +626,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <style>
       .errorBox {
@@ -786,7 +800,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -954,6 +973,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <style>
       nav {
@@ -1213,7 +1236,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -1381,6 +1409,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -1467,7 +1499,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -1635,6 +1672,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 
@@ -1825,7 +1866,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -1993,6 +2039,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <div>
       <template if="{{ ref['static'] }}">static</template>
@@ -2072,7 +2122,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -2240,6 +2295,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style><!-- These comments are here to allow newlines.
      --><template if="{{ isDart }}"><!--
        --><template if="{{ qualified &amp;&amp; !hasParent &amp;&amp; hasClass }}"><!--
@@ -2312,7 +2371,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -2480,6 +2544,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <template if="{{ nameIsEmpty }}">
     <a href="{{ url }}">unnamed</a>
@@ -2553,7 +2621,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -2721,6 +2794,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
@@ -2786,7 +2863,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -2954,6 +3036,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -3153,7 +3239,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -3321,6 +3412,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
@@ -3400,7 +3495,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -3568,6 +3668,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <style>
       div.flex-row:hover {
@@ -3804,7 +3908,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -3972,6 +4081,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -4051,7 +4164,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -4219,6 +4337,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -4306,6 +4428,803 @@
   
   
   
+
+  
+  
+  
+  
+  
+<polymer-element name="stack-frame" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <div class="flex-row">
+      <div class="flex-item-fixed-1-12">
+      </div>
+      <div class="flex-item-fixed-1-12">
+        #{{ frame['depth'] }}
+      </div>
+      <div class="flex-item-fixed-9-12">
+        <function-ref ref="{{ frame['function'] }}"></function-ref>
+          ( <script-ref ref="{{ frame['script'] }}" pos="{{ frame['tokenPos'] }}">
+          </script-ref> )
+
+          <curly-block>
+            <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>
+      <div class="flex-item-fixed-1-12">
+      </div>
+    </div>
+  </template>
+  
+</polymer-element>
+<polymer-element name="flag-list" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <nav-menu link="{{ flagList.isolate.relativeHashLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content-centered">
+      <template if="{{ flagList['modifiedFlags'].isNotEmpty }}">
+        <h1>Modified Flags</h1>
+        <br>
+        <template repeat="{{ flag in flagList['modifiedFlags'] }}">
+          <flag-item flag="{{ flag }}"></flag-item>
+          <br>
+        </template>
+        <hr>
+      </template>
+
+      <h1>Unmodified Flags</h1>
+      <br>
+      <template if="{{ flagList['unmodifiedFlags'].isEmpty }}">
+        <em>None</em>
+      </template>
+      <template if="{{ flagList['unmodifiedFlags'].isNotEmpty }}">
+        <template repeat="{{ flag in flagList['unmodifiedFlags'] }}">
+          <flag-item flag="{{ flag }}"></flag-item>
+          <br>
+        </template>
+      </template>
+    </div>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="flag-item" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <span style="color:#aaa">// {{ flag['comment'] }}</span>
+    <div style="padding: 3px 0">
+      <b>{{ flag['name'] }}</b>
+      &nbsp;=&nbsp;
+      {{ flag['valueAsString'] }}
+    </div>
+  </template>
+</polymer-element>
+
+
+
+  
+  
+  
   
   
   
@@ -4418,7 +5337,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -4586,6 +5510,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -4756,7 +5684,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -4924,6 +5857,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <style>
     .hover {
@@ -5020,7 +5957,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -5188,6 +6130,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
 
     <nav-bar>
@@ -5205,12 +6151,298 @@
           <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
         </li>
       </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a>
+        </li>
+      </ul>
+
     </div>
     <br>
     <hr>
   </template>
 </polymer-element>
 
+<polymer-element name="io-ref" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <template if="{{ ref.serviceType == 'Socket' }}">
+      <io-socket-ref ref="{{ ref }}"></io-socket-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'HttpServer' }}">
+      <io-http-server-ref ref="{{ ref }}"></io-http-server-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'WebSocket' }}">
+      <io-web-socket-ref ref="{{ ref }}"></io-web-socket-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'Process' }}">
+      <io-process-ref ref="{{ ref }}"></io-process-ref>
+    </template>
+  </template>
+</polymer-element>
+
 <polymer-element name="io-http-server-list-view" extends="observatory-element">
   <template>
     <style>
@@ -5271,7 +6503,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -5439,6 +6676,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
 
     <nav-bar>
@@ -5524,7 +6765,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -5692,6 +6938,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <a href="{{ url }}">{{ name }}</a>
   </template>
@@ -5757,7 +7007,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -5925,6 +7180,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
 
     <nav-bar>
@@ -5939,6 +7198,10 @@
 
       <div class="memberList">
         <div class="memberItem">
+          <div class="memberName">Socket</div>
+          <div class="memberValue"><io-socket-ref ref="{{ httpServer['socket'] }}"></io-socket-ref></div>
+        </div>
+        <div class="memberItem">
           <div class="memberName">Address</div>
           <div class="memberValue">{{ httpServer['address'] }}</div>
         </div>
@@ -5961,6 +7224,3201 @@
   </template>
 </polymer-element>
 
+<polymer-element name="io-socket-ref" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-socket-list-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Sockets</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ socket in list['members'] }}">
+          <li class="list-group-item">
+            <io-socket-ref ref="{{ socket }}"></io-socket-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-socket-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <!-- Pipe Socket -->
+      <template if="{{ socket.isPipe }}">
+        <h1>Pipe Socket</h1>
+        <div class="memberList">
+          <template if="{{ socket.socketOwner != null }}">
+            <div class="memberItem">
+              <div class="memberName">Owner</div>
+              <div class="memberValue"><io-ref ref="{{ socket.socketOwner }}"></io-ref></div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">File descriptor</div>
+            <div class="memberValue">{{ socket.fd }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Read Closed</div>
+            <div class="memberValue">{{ socket.readClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Write Closed</div>
+            <div class="memberValue">{{ socket.writeClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Closing</div>
+            <div class="memberValue">{{ socket.closing }}</div>
+          </div>
+        </div>
+      </template>
+      <!-- Network Socket -->
+      <template if="{{ !socket.isPipe }}">
+        <h1>Network Socket</h1>
+        <div class="memberList">
+          <template if="{{ socket.socketOwner != null }}">
+            <div class="memberItem">
+              <div class="memberName">Owner</div>
+              <div class="memberValue"><io-ref ref="{{ socket.socketOwner }}"></io-ref></div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">Local Address</div>
+            <div class="memberValue">{{ socket.localAddress }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Local Port</div>
+            <div class="memberValue">{{ socket.localPort }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Remote Address</div>
+            <div class="memberValue">{{ socket.remoteAddress }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Remote Port</div>
+            <div class="memberValue">{{ socket.remotePort }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">File descriptor</div>
+            <div class="memberValue">{{ socket.fd }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Read Closed</div>
+            <div class="memberValue">{{ socket.readClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Write Closed</div>
+            <div class="memberValue">{{ socket.writeClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Closing</div>
+            <div class="memberValue">{{ socket.closing }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Listening</div>
+            <div class="memberValue">{{ socket.listening }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Protocol</div>
+            <div class="memberValue">{{ socket.protocol }}</div>
+          </div>
+        </div>
+      </template>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-ref" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-list-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>WebSockets</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ webSocket in list['members'] }}">
+          <li class="list-group-item">
+            <io-web-socket-ref ref="{{ webSocket }}"></io-web-socket-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>WebSocket</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Socket</div>
+          <div class="memberValue"><io-socket-ref ref="{{ webSocket['socket'] }}"></io-socket-ref></div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-ref" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-list-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Random Access Files</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ file in list['members'] }}">
+          <li class="list-group-item">
+            <io-random-access-file-ref ref="{{ file }}"></io-random-access-file-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Random Access File</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Path</div>
+          <div class="memberValue">{{ file['name'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Pending Operation</div>
+          <div class="memberValue">{{ file['asyncDispatched'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">File Descriptor</div>
+          <div class="memberValue">{{ file['fd'] }}</div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-list-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Processes</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ process in list['members'] }}">
+          <li class="list-group-item">
+            <io-process-ref ref="{{ process }}"></io-process-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-ref" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <template if="{{ small }}">
+      <a href="{{ url }}">{{ name }}</a>
+    </template>
+    <template if="{{ !small }}">
+      <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
+    </template>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Process</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Path</div>
+          <div class="memberValue">{{ process['name'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Pid</div>
+          <div class="memberValue">{{ process['pid'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Arguments</div>
+          <div class="memberValue">{{ process['arguments'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Started</div>
+          <div class="memberValue">{{ process['started'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Working Directory</div>
+          <div class="memberValue">{{ process['workingDirectory'] }}</div>
+        </div>
+        <template if="{{ process['stdin'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stdin</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stdin'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ process['stdout'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stdout</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stdout'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ process['stderr'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stderr</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stderr'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+      </div>
+
+      <br>
+
+      <h2>Environment</h2>
+      <div class="well">
+        <div class="monospace break-wrap">
+          <template repeat="{{ variable in process['environment'] }}">
+            {{ variable }}
+            <br>
+          </template>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
 
 
 
@@ -6023,7 +10481,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -6191,6 +10654,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
@@ -6263,7 +10730,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -6431,6 +10903,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <div class="flex-row">
       <div class="flex-item-10-percent">
@@ -6588,7 +11064,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -6756,6 +11237,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <template if="{{ isolate.error != null }}">
       <div class="content-centered">
@@ -6901,7 +11386,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -7069,6 +11559,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <style>
       .sourceInset {
@@ -7265,7 +11759,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -7433,6 +11932,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -7682,7 +12185,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -7850,6 +12358,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
 
     <nav-bar>
@@ -8063,7 +12575,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -8231,6 +12748,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <style>
     .table {
@@ -8494,7 +13015,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -8662,6 +13188,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -8905,7 +13435,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -9073,6 +13608,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
@@ -9099,271 +13638,6 @@
   
   
   
-
-  
-  
-  
-  
-  
-<polymer-element name="stack-frame" extends="observatory-element">
-  <template>
-    <style>
-/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 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;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style:italic;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-</style>
-    <div class="flex-row">
-      <div class="flex-item-fixed-1-12">
-      </div>
-      <div class="flex-item-fixed-1-12">
-        #{{ frame['depth'] }}
-      </div>
-      <div class="flex-item-fixed-9-12">
-        <function-ref ref="{{ frame['function'] }}"></function-ref>
-          ( <script-ref ref="{{ frame['script'] }}" pos="{{ frame['tokenPos'] }}">
-          </script-ref> )
-
-          <curly-block>
-            <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>
-      <div class="flex-item-fixed-1-12">
-      </div>
-    </div>
-  </template>
-  
-</polymer-element>
 <polymer-element name="stack-trace" extends="observatory-element">
   <template>
     <style>
@@ -9424,7 +13698,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -9592,6 +13871,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -9685,7 +13968,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -9853,6 +14141,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
 
     <nav-bar>
@@ -9879,6 +14171,12 @@
           <div class="memberName">asserts enabled</div>
           <div class="memberValue">{{ vm.assertsEnabled }}</div>
         </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="#/flags">flags</a>
+          </div>
+        </div>
       </div>
     </div>
 
@@ -9975,7 +14273,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -10143,6 +14446,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -10221,7 +14528,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -10389,6 +14701,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -10462,7 +14778,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -10630,6 +14951,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html._data b/runtime/bin/vmservice/client/deployed/web/index.html._data
new file mode 100644
index 0000000..244ac94
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/index.html._data
@@ -0,0 +1 @@
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/collapsible_content.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/response_viewer.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
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 3a6bb27..2892608 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
@@ -156,7 +156,7 @@
 "^":"",
 x:function(a){return void 0},
 Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-M3:function(a){var z,y,x,w
+m0:function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -174,14 +174,14 @@
 y=z
 for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
 if(x.n(a,y[w]))return w}return},
-Dc:function(a){var z,y,x
+Xr:function(a){var z,y,x
 z=J.TZ(a)
 if(z==null)return
 y=$.Au
 x=z+1
 if(x>=y.length)return H.e(y,x)
 return y[x]},
-Nq:function(a,b){var z,y,x
+YC:function(a,b){var z,y,x
 z=J.TZ(a)
 if(z==null)return
 y=$.Au
@@ -193,7 +193,7 @@
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
 bu:function(a){return H.a5(a)},
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gZ2(),null))},"$1","gxK",2,0,null,47],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,63],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
@@ -202,21 +202,21 @@
 giO:function(a){return a?519018:218159},
 gbx:function(a){return C.BQ},
 $isa2:true},
-we:{
+ht:{
 "^":"Gv;",
 n:function(a,b){return null==b},
 bu:function(a){return"null"},
 giO:function(a){return 0},
 gbx:function(a){return C.GX},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,47]},
-QI:{
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,63]},
+wm:{
 "^":"Gv;",
 giO:function(a){return 0},
 gbx:function(a){return C.CS}},
 iC:{
-"^":"QI;"},
+"^":"wm;"},
 kdQ:{
-"^":"QI;"},
+"^":"wm;"},
 Q:{
 "^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
@@ -224,7 +224,7 @@
 W4:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
 return a.splice(b,1)[0]},
-aP:function(a,b,c){if(b<0||b>a.length)throw H.b(P.N(b))
+xe:function(a,b,c){if(b<0||b>a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
 a.splice(b,0,c)},
 UG:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
@@ -234,12 +234,12 @@
 for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
 ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
-Ft:[function(a,b){return H.VM(new H.zs(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"Gb",ret:P.cX,args:[{func:"hT",ret:P.cX,args:[a]}]}},this.$receiver,"Q")},48],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},28],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.cX,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},48],
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},28],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -256,7 +256,7 @@
 return H.VM(a.slice(b,c),[H.Kp(a,0)])},
 Mu:function(a,b,c){H.xF(a,b,c)
 return H.j5(a,b,c,null)},
-gtH:function(a){if(a.length>0)return a[0]
+geK:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -272,7 +272,7 @@
 H.tb(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
 this.sB(a,z-(c-b))},
-Vr:function(a,b){return H.Ck(a,b)},
+Vr:function(a,b){return H.qo(a,b)},
 XP:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
 H.rd(a,b)},
 Jd:function(a){return this.XP(a,null)},
@@ -285,7 +285,7 @@
 return!1},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-bu:function(a){return H.mx(a,"[","]")},
+bu:function(a){return P.WE(a,"[","]")},
 tt:function(a,b){var z
 if(b)return H.VM(a.slice(),[H.Kp(a,0)])
 else{z=H.VM(a.slice(),[H.Kp(a,0)])
@@ -310,8 +310,8 @@
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 P:{
 "^":"Gv;",
 iM:function(a,b){var z
@@ -335,11 +335,11 @@
 UD:function(a){if(a<0)return-Math.round(-a)
 else return Math.round(a)},
 Sy:function(a,b){var z
-if(b>20)throw H.b(P.C3(b))
+if(b>20)throw H.b(P.KP(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
 return z},
-WZ:function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
+WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:function(a){if(a===0&&1/a<0)return"-0.0"
 else return""+a},
@@ -390,7 +390,7 @@
 return a>=b},
 gbx:function(a){return C.yT},
 $isFK:true,
-static:{"^":"Ng,N6l"}},
+static:{"^":"SAz,N6l"}},
 L7:{
 "^":"P;",
 gbx:function(a){return C.yw},
@@ -399,7 +399,7 @@
 $isKN:true},
 Pp:{
 "^":"P;",
-gbx:function(a){return C.AY},
+gbx:function(a){return C.CR},
 $isCP:true,
 $isFK:true},
 O:{
@@ -536,13 +536,13 @@
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
-x=P.L5(null,null,null,P.KN,H.zL)
+x=P.L5(null,null,null,P.KN,H.yo)
 w=P.Ls(null,null,null,P.KN)
-v=new H.zL(0,null,!1)
+v=new H.yo(0,null,!1)
 u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 w.h(0,0)
 u.O9(0,v)
-init.globalState.yc=u
+init.globalState.Nr=u
 init.globalState.N0=u
 y=H.G3()
 x=H.KT(y,[y]).BD(a)
@@ -565,20 +565,20 @@
 if(y!=null)return y[1]
 throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-z=H.Hh(b.data)
+z=H.Kh(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.oL=y.t(z,"id")
 x=y.t(z,"functionName")
 w=x==null?init.globalState.w2:init.globalFunctions[x]()
 v=y.t(z,"args")
-u=H.Hh(y.t(z,"msg"))
+u=H.Kh(y.t(z,"msg"))
 t=y.t(z,"isSpawnUri")
 s=y.t(z,"startPaused")
-r=H.Hh(y.t(z,"replyTo"))
+r=H.Kh(y.t(z,"replyTo"))
 y=init.globalState.Hg++
-q=P.L5(null,null,null,P.KN,H.zL)
+q=P.L5(null,null,null,P.KN,H.yo)
 p=P.Ls(null,null,null,P.KN)
-o=new H.zL(0,null,!1)
+o=new H.yo(0,null,!1)
 n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 p.h(0,0)
 n.O9(0,o)
@@ -621,12 +621,12 @@
 x=H.t0(P.EF(["command","log","msg",a],null,null))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
-z=new H.oP(w,null)
+z=new H.XO(w,null)
 throw H.b(P.FM(z))}},
 Di:function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
-$.z7=$.z7+("_"+y)
+$.H9=$.H9+("_"+y)
 $.eb=$.eb+("_"+y)
 y=z.EE
 x=init.globalState.N0.jO
@@ -641,20 +641,20 @@
 return z.Zo(a)}else{z=new H.Qt(new H.cx())
 z.mR=new H.aJ(null)
 return z.Zo(a)}},
-Hh:function(a){if(init.globalState.ji===!0)return new H.EU(null).ug(a)
+Kh:function(a){if(init.globalState.ji===!0)return new H.BV(null).ug(a)
 else return a},
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 PK:{
-"^":"Xs:42;a,b",
+"^":"Tp:64;a,b",
 $0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 JO:{
-"^":"Xs:42;a,c",
+"^":"Tp:64;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 f0:{
-"^":"a;Hg,oL,Y7,N0,yc,Xz,Ai,EF,ji,i2<,vd,XC,w2<",
+"^":"a;Hg,oL,Y7,N0,Nr,Xz,Ai,EF,ji,i2<,vd,XC,w2<",
 i6:function(a){var z,y,x,w
 z=$.My()==null
 y=$.nB()
@@ -676,7 +676,7 @@
 $.jk().onmessage=w
 $.jk().dartPrint=function(b){}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,Vp<,lJ,CN,M2,mf,pa,ir",
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,mf,pa,ir",
 V0:function(a,b){if(!this.um.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.PC()},
@@ -684,7 +684,7 @@
 if(!this.UF)return
 z=this.lJ
 z.Rz(0,a)
-if(z.X5===0){for(z=this.Vp;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
+if(z.X5===0){for(z=this.C9;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
 x=z.pop()
 y=init.globalState.Xz.Rk
 w=y.av
@@ -702,7 +702,7 @@
 IB:function(a){var z=this.CN
 if(z==null)return
 J.Dq(z,a)},
-MZ:function(a,b){if(!this.PX.n(0,a))return
+JZ:function(a,b){if(!this.PX.n(0,a))return
 this.pa=b},
 Wq:function(a,b){var z,y
 z=J.x(b)
@@ -730,7 +730,7 @@
 this.M2=z}z.NZ(this.gQb())},
 hk:function(a,b){var z,y
 z=this.ir
-if(z.X5===0){if(this.pa===!0&&this===init.globalState.yc)return
+if(z.X5===0){if(this.pa===!0&&this===init.globalState.Nr)return
 z=$.jk()
 if(z.console!=null&&typeof z.console.error=="function")z.console.error(a,b)
 else{P.FL(a)
@@ -747,13 +747,13 @@
 this.mf=!0
 try{y=b.$0()}catch(v){u=H.Ru(v)
 x=u
-w=new H.oP(v,null)
+w=new H.XO(v,null)
 this.hk(x,w)
 if(this.pa===!0){this.Dm()
-if(this===init.globalState.yc)throw v}}finally{this.mf=!1
+if(this===init.globalState.Nr)throw v}}finally{this.mf=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
-if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,49,50],
+if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,65,66],
 Ds:function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.V0(z.t(a,1),z.t(a,2))
 break
@@ -763,7 +763,7 @@
 break
 case"remove-ondone":this.IB(z.t(a,1))
 break
-case"set-errors-fatal":this.MZ(z.t(a,1),z.t(a,2))
+case"set-errors-fatal":this.JZ(z.t(a,1),z.t(a,2))
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
@@ -792,7 +792,7 @@
 this.CN=null}},"$0","gQb",0,0,15],
 $isaX:true},
 NY:{
-"^":"Xs:15;a",
+"^":"Tp:15;a",
 $0:[function(){J.m9(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
@@ -802,12 +802,12 @@
 return z.AR()},
 xB:function(){var z,y,x
 z=this.mj()
-if(z==null){if(init.globalState.yc!=null&&init.globalState.i2.x4(init.globalState.yc.jO)&&init.globalState.Ai===!0&&init.globalState.yc.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
+if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.Ai===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
 if(y.EF===!0&&y.i2.X5===0&&y.Xz.GL===0){y=y.vd
 x=H.t0(P.EF(["command","close"],null,null))
 y.toString
-self.postMessage(x)}return!1}z.Fn()
+self.postMessage(x)}return!1}J.R1(z)
 return!0},
 Wu:function(){if($.My()!=null)new H.QB(this).$0()
 else for(;this.xB(););},
@@ -815,29 +815,29 @@
 if(init.globalState.EF!==!0)this.Wu()
 else try{this.Wu()}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
+y=new H.XO(x,null)
 w=init.globalState.vd
 v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
 w.toString
 self.postMessage(v)}}},
 QB:{
-"^":"Xs:15;a",
+"^":"Tp:15;a",
 $0:[function(){if(!this.a.xB())return
 P.ww(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,i3,G1>",
-Fn:function(){if(this.od.gUF()){this.od.gVp().push(this)
-return}J.QT(this.od,this.i3)},
+Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
+return}J.QT(this.od,this.i3)},"$0","gNN",0,0,15],
 $isIY:true},
 JH:{
 "^":"a;"},
 mN:{
-"^":"Xs:42;a,b,c,d,e,f",
+"^":"Tp:64;a,b,c,d,e,f",
 $0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 vK:{
-"^":"Xs:15;a,b,c,d,e",
+"^":"Tp:15;a,b,c,d,e",
 $0:[function(){var z,y,x
 this.e.sxF(!0)
 if(this.d!==!0)this.a.$1(this.c)
@@ -852,7 +852,7 @@
 Iy4:{
 "^":"a;",
 $isRZ:true,
-$ishq:true},
+$iswC:true},
 Ze:{
 "^":"Iy4;JE,tv",
 wR:function(a,b){var z,y,x,w,v
@@ -874,13 +874,13 @@
 giO:function(a){return J.Mo(this.JE)},
 $isZe:true,
 $isRZ:true,
-$ishq:true},
+$iswC:true},
 Ua:{
-"^":"Xs:42;a,b,c",
+"^":"Tp:64;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
-y.a=H.Hh(y.a)}z.Rf(this.a.a)}},"$0",null,0,0,null,"call"],
+y.a=H.Kh(y.a)}z.Rf(this.a.a)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 dd:{
 "^":"Iy4;ZU,bv,tv",
@@ -892,20 +892,20 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isdd&&J.xC(this.ZU,b.ZU)&&J.xC(this.tv,b.tv)&&J.xC(this.bv,b.bv)},
 giO:function(a){var z,y,x
-z=J.Eh(this.ZU,16)
-y=J.Eh(this.tv,8)
+z=J.lf(this.ZU,16)
+y=J.lf(this.tv,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
 $isdd:true,
 $isRZ:true,
-$ishq:true},
-zL:{
+$iswC:true},
+yo:{
 "^":"a;x6>,D1,P0<",
 zd:function(a){return this.D1.$1(a)},
 pr:function(){this.P0=!0
 this.D1=null},
-xO:function(a){var z,y
+S6:function(a){var z,y
 if(this.P0)return
 this.P0=!0
 this.D1=null
@@ -916,10 +916,10 @@
 z.PC()},
 Rf:function(a){if(this.P0)return
 this.zd(a)},
-$iszL:true,
-static:{"^":"v0"}},
+$isyo:true,
+static:{"^":"Fd"}},
 RS:{
-"^":"Tf;Ao,mR",
+"^":"jP1;Ao,mR",
 DE:function(a){if(!!a.$isZe)return["sendport",init.globalState.oL,a.tv,J.Mo(a.JE)]
 if(!!a.$isdd)return["sendport",a.ZU,a.tv,a.bv]
 throw H.b("Illegal underlying port "+a.bu(0))},
@@ -932,7 +932,7 @@
 throw H.b("Illegal underlying port "+a.bu(0))},
 yf:function(a){if(!!a.$isiV)return new H.iV(a.x6)
 throw H.b("Capability not serializable: "+a.bu(0))}},
-EU:{
+BV:{
 "^":"lY;RZ",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
@@ -972,9 +972,9 @@
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
 if(!!z.$isWO)return this.wb(a)
-if(!!z.$isZ0)return this.TI(a)
+if(!!z.$isZ0)return this.pi(a)
 if(!!z.$isRZ)return this.DE(a)
-if(!!z.$ishq)return this.yf(a)
+if(!!z.$iswC)return this.yf(a)
 return this.N1(a)},
 N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
@@ -990,7 +990,7 @@
 this.mR.u(0,a,z)
 for(w=0;w<x;++w)z[w]=this.Q9(y.t(a,w))
 return z},
-TI:function(a){var z,y
+pi:function(a){var z,y
 z={}
 y=this.mR.t(0,a)
 z.a=y
@@ -1003,11 +1003,11 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Xs:51;a,b",
+"^":"Tp:67;a,b",
 $2:function(a,b){var z=this.b
 J.kW(this.a.a,z.Q9(a),z.Q9(b))},
 $isEH:true},
-Tf:{
+jP1:{
 "^":"BB;",
 Pq:function(a){return a},
 wb:function(a){var z,y
@@ -1016,7 +1016,7 @@
 y=this.Ao++
 this.mR.u(0,a,y)
 return["list",y,this.mE(a)]},
-TI:function(a){var z,y
+pi:function(a){var z,y
 z=this.mR.t(0,a)
 if(z!=null)return["ref",z]
 y=this.Ao++
@@ -1036,8 +1036,8 @@
 "^":"a;",
 ug:function(a){if(H.ZR(a))return a
 this.RZ=P.YM(null,null,null,null,null)
-return this.XE(a)},
-XE:function(a){var z,y
+return this.D5(a)},
+D5:function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
 switch(z.t(a,0)){case"ref":y=z.t(a,1)
@@ -1056,7 +1056,7 @@
 w=z.gB(x)
 if(typeof w!=="number")return H.s(w)
 v=0
-for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
+for(;v<w;++v)z.u(x,v,this.D5(z.t(x,v)))
 return x},
 en:function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
@@ -1070,7 +1070,7 @@
 if(typeof u!=="number")return H.s(u)
 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)))
+for(;s<u;++s)z.u(0,this.D5(y.t(w,s)),this.D5(t.t(v,s)))
 return z},
 PR:function(a){throw H.b("Unexpected serialized object")}},
 yH:{
@@ -1095,12 +1095,12 @@
 z.Qa(a,b)
 return z}}},
 Av:{
-"^":"Xs:15;a,b",
+"^":"Tp:15;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Wl:{
-"^":"Xs:15;c,d",
+"^":"Tp:15;c,d",
 $0:[function(){this.c.p9=null
 H.cv()
 this.d.$0()},"$0",null,0,0,null,"call"],
@@ -1125,7 +1125,7 @@
 y=b.x6
 return z==null?y==null:z===y}return!1},
 $isiV:true,
-$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
+$iswC:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1151,7 +1151,7 @@
 if(z[2]!=null)return parseInt(a,16)
 if(3>=y)return H.e(z,3)
 if(z[3]!=null)return parseInt(a,10)
-return c.$1(a)}b=10}else{if(b<2||b>36)throw H.b(P.C3("Radix "+H.d(b)+" not in range 2..36"))
+return c.$1(a)}b=10}else{if(b<2||b>36)throw H.b(P.KP("Radix "+H.d(b)+" not in range 2..36"))
 if(z!=null){if(b===10){if(3>=z.length)return H.e(z,3)
 y=z[3]!=null}else y=!1
 if(y)return parseInt(a,10)
@@ -1198,7 +1198,7 @@
 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.Cb(z)},
-eT:function(a){var z,y
+BZ: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))
@@ -1223,11 +1223,11 @@
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
 return w.valueOf()}return y},
-U8:function(a){if(a.date===void 0)a.date=new Date(a.y3)
+o2:function(a){if(a.date===void 0)a.date=new Date(a.y3)
 return a.date},
 of:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 return a[b]},
-Ch:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+R0:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 a[b]=c},
 zo:function(a,b,c){var z,y,x
 z={}
@@ -1237,7 +1237,7 @@
 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.lk(z,y,x))
-return J.T1(a,new H.mX(C.Ka,"$"+z.a+z.b,0,y,x,null))},
+return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
 im: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*"]
@@ -1249,7 +1249,7 @@
 if(w!==b.length)return H.zo(a,b,c)
 v=P.L5(null,null,null,null,null)
 for(u=x.hG,t=0;t<u;++t){s=t+w
-v.u(0,x.QN(s),init.metadata[x.Fk(s)])}z.a=!1
+v.u(0,x.KE(s),init.metadata[x.Fk(s)])}z.a=!1
 c.aN(0,new H.u8(z,v))
 if(z.a)return H.zo(a,b,c)
 C.Nm.FV(b,v.gUQ(v))
@@ -1281,7 +1281,7 @@
 y=a.message
 if("number" in a&&typeof a.number=="number"){x=a.number
 w=x&65535
-if((C.jn.GG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.vR(H.d(y)+" (Error "+w+")",null))
+if((C.jn.GG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.T3(H.d(y)+" (Error "+w+")",null))
 case 445:case 5007:v=H.d(y)+" (Error "+w+")"
 return z.$1(new H.Zo(v,null))}}if(a instanceof TypeError){v=$.WD()
 u=$.KL()
@@ -1294,10 +1294,10 @@
 o=$.eA()
 n=$.ko()
 m=v.qS(y)
-if(m!=null)return z.$1(H.vR(y,m))
+if(m!=null)return z.$1(H.T3(y,m))
 else{m=u.qS(y)
 if(m!=null){m.method="call"
-return z.$1(H.vR(y,m))}else{m=t.qS(y)
+return z.$1(H.T3(y,m))}else{m=t.qS(y)
 if(m==null){m=s.qS(y)
 if(m==null){m=r.qS(y)
 if(m==null){m=q.qS(y)
@@ -1318,18 +1318,18 @@
 for(y=0;y<z;y=w){x=y+1
 w=x+1
 b.u(0,a[y],a[x])}return b},
-Ib:[function(a,b,c,d,e,f,g){var z=J.x(c)
+El:[function(a,b,c,d,e,f,g){var z=J.x(c)
 if(z.n(c,0))return H.zd(b,new H.dr(a))
 else if(z.n(c,1))return H.zd(b,new H.TL(a,d))
 else if(z.n(c,2))return H.zd(b,new H.uZ(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.OQ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.Qx(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","DB",14,0,null,3,4,5,6,7,8,9],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","Q8",14,0,null,3,4,5,6,7,8,9],
 tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
 if(!!z)return z
-z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.Ib)
+z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.El)
 a.$identity=z
 return z},
 HA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
@@ -1349,7 +1349,7 @@
 v.prototype=w
 u=!d
 if(u){t=e.length==1&&!0
-s=H.bx(a,z,t)
+s=H.SD(a,z,t)
 s.$reflectionInfo=c}else{w.$name=f
 s=z
 t=!1}if(typeof x=="number")r=function(g){return function(){return init.metadata[g]}}(x)
@@ -1359,7 +1359,7 @@
 w[y]=s
 for(u=b.length,p=1;p<u;++p){o=b[p]
 n=o.$callName
-if(n!=null){m=d?o:H.bx(a,o,t)
+if(n!=null){m=d?o:H.SD(a,o,t)
 w[n]=m}}w["call*"]=s
 return v},
 vq:function(a,b,c,d){var z=H.dS
@@ -1370,22 +1370,22 @@
 case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
 default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
-bx:function(a,b,c){var z,y,x,w,v,u
-if(c)return H.Hf(a,b)
+SD:function(a,b,c){var z,y,x,w,v,u
+if(c)return H.eT(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
 if(y===0){w=$.bf
-if(w==null){w=H.E2("self")
+if(w==null){w=H.Iq("self")
 $.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
 $.OK=J.ew(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
 v=$.bf
-if(v==null){v=H.E2("self")
+if(v==null){v=H.Iq("self")
 $.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.ew(w,1)
@@ -1393,7 +1393,7 @@
 Z4:function(a,b,c,d){var z,y
 z=H.dS
 y=H.HY
-switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
+switch(b?-1:a){case 0:throw H.b(H.Yi("Intercepted function with no arguments."))
 case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
 case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
 case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
@@ -1403,11 +1403,11 @@
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
 return e.apply(f(this),h)}}(d,z,y)}},
-Hf:function(a,b){var z,y,x,w,v,u,t,s
-z=H.oN()
-y=$.U9
-if(y==null){y=H.E2("receiver")
-$.U9=y}x=b.$stubName
+eT:function(a,b){var z,y,x,w,v,u,t,s
+z=H.bO()
+y=$.P4
+if(y==null){y=H.Iq("receiver")
+$.P4=y}x=b.$stubName
 w=b.length
 v=typeof dart_precompiled=="function"
 u=a[x]
@@ -1434,7 +1434,7 @@
 ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 Og:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.tu(z)
+if(b==null||b.length===0)return new H.Fp(z)
 return new H.Tu(z,b,null)},
 G3:function(){return C.KZ},
 IL:function(a){return new H.cu(a,null)},
@@ -1552,7 +1552,7 @@
 ml:function(a,b,c){return a.apply(b,c)},
 Pq:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
-KS:function(a){return H.eQ(a)},
+wzi:function(a){return H.eQ(a)},
 bm:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
 w3:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
@@ -1613,7 +1613,7 @@
 z["*"+v]=s}}},
 kO:function(){var z,y,x,w,v,u,t
 z=C.MA()
-z=H.ud(C.JS,H.ud(C.NH,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ku(C.w2),z)))))))
+z=H.ud(C.mp,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ku(C.w2),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
 if(typeof y=="function")y=[y]
 if(y.constructor==Array)for(x=0;x<y.length;++x){w=y[x]
@@ -1621,8 +1621,8 @@
 u=z.getUnknownTag
 t=z.prototypeForTag
 $.NF=new H.dC(v)
-$.TX=new H.wN(u)
-$.x7=new H.VX(t)},
+$.TX=new H.VX(u)
+$.x7=new H.vZ(t)},
 ud:function(a,b){return a(b)||b},
 ZT:function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
@@ -1674,13 +1674,13 @@
 gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
 hY:{
-"^":"Xs:10;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,52,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,68,"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
 gA:function(a){return J.mY(this.Y3.tc)}},
-mX:{
+LI:{
 "^":"a;lK,uk,xI,rq,FX,Nc",
 gWa:function(){return this.lK},
 gUA:function(){return this.xI===0},
@@ -1694,7 +1694,7 @@
 x.push(z[w])}x.immutable$list=!0
 x.fixed$length=!0
 return x},
-gZ2:function(){var z,y,x,w,v,u,t,s
+gVm:function(){var z,y,x,w,v,u,t,s
 if(this.xI!==0)return P.Fl(P.IN,null)
 z=this.FX
 y=z.length
@@ -1720,7 +1720,7 @@
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.BX(0,a)
 return this.BX(0,this.e4(a-z))},
-QN:function(a){var z=this.Rv
+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))},
@@ -1737,7 +1737,7 @@
 H.bQ(y,new H.uV(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
 return z[a]},
-static:{"^":"t4,FV,Tj,yM",zh:function(a){var z,y,x
+static:{"^":"t4A,FV,OcN,yM",zh:function(a){var z,y,x
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
@@ -1746,7 +1746,7 @@
 x=z[1]
 return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 uV:{
-"^":"Xs:2;a,b,c",
+"^":"Tp:2;a,b,c",
 $1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
@@ -1755,14 +1755,14 @@
 z[y]=x},
 $isEH:true},
 lk:{
-"^":"Xs:53;a,b,c",
+"^":"Tp:69;a,b,c",
 $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},
 $isEH:true},
 u8:{
-"^":"Xs:53;a,b",
+"^":"Tp:69;a,b",
 $2:function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
 else this.a.a=!0},
@@ -1796,37 +1796,37 @@
 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)},S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
 try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
 Zo:{
-"^":"XS;V7,Ga",
+"^":"XS;K9,Ga",
 bu:function(a){var z=this.Ga
-if(z==null)return"NullError: "+H.d(this.V7)
+if(z==null)return"NullError: "+H.d(this.K9)
 return"NullError: Cannot call \""+H.d(z)+"\" on null"},
-$ismp:true,
+$isJS:true,
 $isXS:true},
 u0:{
-"^":"XS;V7,Ga,cR",
+"^":"XS;K9,Ga,cR",
 bu:function(a){var z,y
 z=this.Ga
-if(z==null)return"NoSuchMethodError: "+H.d(this.V7)
+if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
 y=this.cR
-if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.V7)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.V7)+")"},
-$ismp:true,
+if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},
+$isJS:true,
 $isXS:true,
-static:{vR:function(a,b){var z,y
+static:{T3:function(a,b){var z,y
 z=b==null
 y=z?null:b.method
 z=z?null:b.receiver
 return new H.u0(a,y,z)}}},
 vV:{
-"^":"XS;V7",
-bu:function(a){var z=this.V7
+"^":"XS;K9",
+bu:function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},
 $isEH:true},
-oP:{
+XO:{
 "^":"a;lA,ui",
 bu:function(a){var z,y
 z=this.ui
@@ -1837,32 +1837,32 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Xs:42;a",
+"^":"Tp:64;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Xs:42;b,c",
+"^":"Tp:64;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"Xs:42;d,e,f",
+"^":"Tp:64;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"Xs:42;UI,bK,IU,Rm",
-$0:function(){return this.UI.$3(this.bK,this.IU,this.Rm)},
+"^":"Tp:64;UI,bK,Gq,Rm",
+$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
 Qx:{
-"^":"Xs:42;w3,HZ,mG,xC,pb",
-$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.pb)},
+"^":"Tp:64;w3,HZ,mG,xC,cj",
+$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
-Xs:{
+Tp:{
 "^":"a;",
 bu:function(a){return"Closure"},
 $isEH:true,
 gKu:function(){return this}},
 Bp:{
-"^":"Xs;"},
+"^":"Tp;"},
 v:{
 "^":"Bp;nw,jm,cR,RA",
 n:function(a,b){if(b==null)return!1
@@ -1875,9 +1875,9 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"bf,U9",dS:function(a){return a.nw},HY:function(a){return a.cR},oN:function(){var z=$.bf
-if(z==null){z=H.E2("self")
-$.bf=z}return z},E2:function(a){var z,y,x,w,v
+static:{"^":"bf,P4",dS:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
+if(z==null){z=H.Iq("self")
+$.bf=z}return z},Iq:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
@@ -1889,10 +1889,10 @@
 bu:function(a){return this.G1},
 $isXS:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
-tc:{
+bb:{
 "^":"XS;G1>",
 bu:function(a){return"RuntimeError: "+H.d(this.G1)},
-static:{Ef:function(a){return new H.tc(a)}}},
+static:{Yi:function(a){return new H.bb(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
@@ -1908,9 +1908,9 @@
 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.P4(y)
+if(y!=null&&y.length!==0)z.args=H.Dz(y)
 y=this.is
-if(y!=null&&y.length!==0)z.opt=H.P4(y)
+if(y!=null&&y.length!==0)z.opt=H.Dz(y)
 y=this.p6
 if(y!=null){w={}
 v=H.kU(y)
@@ -1931,7 +1931,7 @@
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
 x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
-static:{"^":"UA",P4:function(a){var z,y,x
+static:{"^":"lcs",Dz:function(a){var z,y,x
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
@@ -1941,7 +1941,7 @@
 bu:function(a){return"dynamic"},
 za:function(){return},
 $ishJ:true},
-tu:{
+Fp:{
 "^":"lbp;oc>",
 za:function(){var z,y
 z=this.oc
@@ -1976,15 +1976,15 @@
 $iscu:true,
 $isuq:true},
 dC:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a(a)},
 $isEH:true},
-wN:{
-"^":"Xs:54;b",
+VX:{
+"^":"Tp:70;b",
 $2:function(a,b){return this.b(a,b)},
 $isEH:true},
-VX:{
-"^":"Xs:2;c",
+vZ:{
+"^":"Tp:2;c",
 $1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
@@ -2034,7 +2034,7 @@
 return this.Bh(b,c)},
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
-$iswL:true,
+$isKx:true,
 static:{ol:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
@@ -2057,7 +2057,7 @@
 "^":"mW;rN,rv",
 gA:function(a){return new H.Pb(this.rN,this.rv,null)},
 $asmW:function(){return[P.Od]},
-$ascX:function(){return[P.Od]}},
+$asQV:function(){return[P.Od]}},
 Pb:{
 "^":"a;xz,rv,Wh",
 gl:function(){return this.Wh},
@@ -2076,47 +2076,47 @@
 if(z==null){this.rv=null
 return!1}return!0}},
 Vo:{
-"^":"a;M,J9,zO",
+"^":"a;M,f1,zO",
 t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
 return this.zO},
 $isOd:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
 "^":"",
 hV:{
-"^":"LP;IF,Qw,cw,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gv8:function(a){return a.IF},
-sv8:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
-gFR:function(a){return a.Qw},
+"^":"LPc;fi,dB,KW,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gv8:function(a){return a.fi},
+sv8:function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},
+gFR:function(a){return a.dB},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
-gph:function(a){return a.cw},
-sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
-pp:[function(a,b,c,d){var z=a.IF
+sFR:function(a,b){a.dB=this.ct(a,C.AV,a.dB,b)},
+gph:function(a){return a.KW},
+sph:function(a,b){a.KW=this.ct(a,C.hf,a.KW,b)},
+F6:[function(a,b,c,d){var z=a.fi
 if(z===!0)return
-if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
-this.LY(a,null).wM(new X.jE(a))}},"$3","gNa",6,0,55,24,25,56],
+if(a.dB!=null){a.fi=this.ct(a,C.S4,z,!0)
+this.LY(a,null).wM(new X.jE(a))}},"$3","gNa",6,0,71,43,44,72],
 static:{zy:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.IF=!1
-a.Qw=null
-a.cw="action"
+a.fi=!1
+a.dB=null
+a.KW="action"
 a.on=z
 a.BA=y
 a.LL=w
 C.Gx.ZL(a)
 C.Gx.XI(a)
 return a}}},
-LP:{
+LPc:{
 "^":"ir+Pi;",
 $isd3:true},
 jE:{
-"^":"Xs:42;a",
+"^":"Tp:64;a",
 $0:[function(){var z=this.a
-z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
+z.fi=J.Q5(z,C.S4,z.fi,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
@@ -2128,14 +2128,14 @@
 o1:function(a,b){var z
 for(z="";b>1;){--b
 if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
-DD:[function(a){var z,y,x
+le:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
 y=z.Y(a,1000)
 a=z.Z(a,1000)
 x=G.o1(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","xo",2,0,12],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","kh",2,0,12],
 P0:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.UD(a*1000))
 y=C.jn.cU(z,3600000)
@@ -2146,12 +2146,12 @@
 z=C.jn.Y(z,1000)
 if(y>0)return G.o1(y,2)+":"+G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)
 else return G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)},
-Xz:[function(a){var z=J.Wx(a)
+Ef:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
 else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
 else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","Gt",2,0,12,13],
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","Fx",2,0,12,13],
 mG:function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
@@ -2179,9 +2179,9 @@
 z=z.Li
 H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
 kj:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
-window.location.hash=""},"$1","gbf",2,0,57,21],
+window.location.hash=""},"$1","gbf",2,0,73,21],
 t1:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
-window.location.hash=""},"$1","gXa",2,0,58,59],
+window.location.hash=""},"$1","gXa",2,0,74,75],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
 Kf:{
@@ -2189,18 +2189,18 @@
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
 B7:function(){var z=this.Yb
-z.K9("removeRows",[0,z.nQ("getNumberOfRows")])},
+z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
 Id:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
-this.Yb.K9("addRow",[H.VM(new P.Tz(z),[null])])}},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])}},
 qu:{
 "^":"a;vR,bG",
 W2:function(a){var z=P.jT(this.bG)
-this.vR.K9("draw",[a.Yb,z])}},
-dZ:{
+this.vR.V7("draw",[a.Yb,z])}},
+hq:{
 "^":"Pi;ec,JL,AP,fn",
-kI:function(){var z=H.VM(new W.RO(window,C.Bn.Ph,!1),[null])
-H.VM(new W.fd(0,z.bi,z.Ph,W.aF(new G.OH(this)),z.Sg),[H.Kp(z,0)]).Zz()
+kI:function(){var z=H.VM(new W.RO(window,C.yZ.Ph,!1),[null])
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(window.location.hash==="")window.location.hash="#/vm"
 else this.df()},
 df:function(){var z,y,x
@@ -2214,19 +2214,19 @@
 x=z>1?y[1]:""
 if(z>2)N.QM("").j2("Found more than 2 #-characters in "+H.d(this.JL))
 this.ec.wv.cv(J.ZZ(this.JL,2)).ml(new G.wX(this,x))},
-static:{"^":"xp"}},
-OH:{
-"^":"Xs:10;a",
-$1:[function(a){this.a.df()},"$1",null,2,0,null,60,"call"],
+static:{"^":"K3D"}},
+Qe:{
+"^":"Tp:10;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,76,"call"],
 $isEH:true},
 wX:{
-"^":"Xs:10;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=z.ec
 y.AJ=F.Wi(y,C.F3,y.AJ,a)
 z=z.ec
-z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,61,"call"],
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,77,"call"],
 $isEH:true},
 Y2:{
 "^":"Pi;eT>,yt<,ks>,oH<",
@@ -2245,6 +2245,12 @@
 $isY2:true},
 XN:{
 "^":"Pi;WT>,AP,fn",
+qU:function(a){var z,y,x
+z=this.WT
+y=J.U6(z)
+x=y.t(z,a)
+if(x.r8()===!0)y.UG(z,y.u8(z,x)+1,J.Mx(x))
+else this.FS(x)},
 FS:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gks(a))
@@ -2255,24 +2261,24 @@
 w=J.U6(z)
 v=w.u8(z,a)+1
 w.UZ(z,v,v+y)}},
-YA:{
+zb:{
 "^":"a;ph>,xy<",
-static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,14]}},
+static:{mb:[function(a){return a!=null?J.AG(a):"<null>"},"$1","HP",2,0,14]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
 Vz:{
-"^":"Pi;oH<,WT>,tW,pT,jV,AP,fn",
+"^":"Pi;oH<,WT>,c8,pT,jV,AP,fn",
 sxp:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
 gxp:function(){return this.pT},
-Jd:function(a){H.rd(this.tW,new G.NM(this))
+Jd:function(a){H.rd(this.c8,new G.BD(this))
 F.Wi(this,C.DW,0,1)},
-gGD:function(){return this.tW},
+gGD:function(){return this.c8},
 B7:function(){C.Nm.sB(this.WT,0)
-C.Nm.sB(this.tW,0)},
+C.Nm.sB(this.c8,0)},
 Id:function(a,b){var z=this.WT
-this.tW.push(z.length)
+this.c8.push(z.length)
 z.push(b)
 F.Wi(this,C.DW,0,1)},
 tM:[function(a,b){var z,y
@@ -2281,19 +2287,19 @@
 y=J.UQ(J.U8o(z[a]),b)
 z=this.oH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b].gxy().$1(y)},"$2","gwy",4,0,62,63,64],
+return z[b].gxy().$1(y)},"$2","gwy",4,0,78,79,80],
 Qs:[function(a){var z
 if(!J.xC(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.ew(J.Q4(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.Q4(z[a])
-return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,12,64],
+return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,12,80],
 TK:[function(a,b){var z=this.WT
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8o(z[a]),b)},"$2","gyY",4,0,65,63,64]},
-NM:{
-"^":"Xs:51;a",
+return J.UQ(J.U8o(z[a]),b)},"$2","gyY",4,0,81,79,80]},
+BD:{
+"^":"Tp:67;a",
 $2:function(a,b){var z,y,x,w
 z=this.a
 y=z.WT
@@ -2305,1430 +2311,1604 @@
 else return J.oE(x,w)},
 $isEH:true}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
 "^":"",
-Id:[function(){var z,y,x,w,v
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.WC,new E.wa(),C.S4,new E.Or(),C.Ro,new E.YL(),C.AV,new E.wf(),C.C0,new E.Oa(),C.eZ,new E.emv(),C.bk,new E.Lbd(),C.lH,new E.QAa(),C.kG,new E.CvS(),C.OI,new E.edy(),C.XA,new E.waE(),C.i4,new E.Ore(),C.qt,new E.YLa(),C.p1,new E.wfa(),C.bJ,new E.Oaa(),C.ox,new E.e0(),C.WZ,new E.e1(),C.i0,new E.e2(),C.iE,new E.e3(),C.f4,new E.e4(),C.VK,new E.e5(),C.aH,new E.e6(),C.PI,new E.e7(),C.aK,new E.e8(),C.GP,new E.e9(),C.Gr,new E.e10(),C.tP,new E.e11(),C.yh,new E.e12(),C.Zb,new E.e13(),C.u7,new E.e14(),C.ne,new E.e15(),C.B0,new E.e16(),C.r1,new E.e17(),C.mr,new E.e18(),C.Ek,new E.e19(),C.Pn,new E.e20(),C.YT,new E.e21(),C.WQ,new E.e22(),C.Gd,new E.e23(),C.FP,new E.e24(),C.kF,new E.e25(),C.UD,new E.e26(),C.Aq,new E.e27(),C.DS,new E.e28(),C.C9,new E.e29(),C.VF,new E.e30(),C.uU,new E.e31(),C.YJ,new E.e32(),C.eF,new E.e33(),C.oI,new E.e34(),C.ST,new E.e35(),C.QH,new E.e36(),C.qX,new E.e37(),C.rE,new E.e38(),C.nf,new E.e39(),C.pO,new E.e40(),C.EI,new E.e41(),C.JB,new E.e42(),C.Uq,new E.e43(),C.A8,new E.e44(),C.Ql,new E.e45(),C.SI,new E.e46(),C.zS,new E.e47(),C.ak,new E.e48(),C.eo,new E.e49(),C.Ge,new E.e50(),C.He,new E.e51(),C.wq,new E.e52(),C.k6,new E.e53(),C.oj,new E.e54(),C.PJ,new E.e55(),C.Ms,new E.e56(),C.q2,new E.e57(),C.d2,new E.e58(),C.kN,new E.e59(),C.fn,new E.e60(),C.eJ,new E.e61(),C.iG,new E.e62(),C.Py,new E.e63(),C.uu,new E.e64(),C.qs,new E.e65(),C.h7,new E.e66(),C.I9,new E.e67(),C.C1,new E.e68(),C.a0,new E.e69(),C.Yg,new E.e70(),C.bR,new E.e71(),C.ai,new E.e72(),C.ob,new E.e73(),C.Iv,new E.e74(),C.Wg,new E.e75(),C.tD,new E.e76(),C.nZ,new E.e77(),C.Of,new E.e78(),C.pY,new E.e79(),C.Lk,new E.e80(),C.dK,new E.e81(),C.xf,new E.e82(),C.rB,new E.e83(),C.bz,new E.e84(),C.Jx,new E.e85(),C.b5,new E.e86(),C.Lc,new E.e87(),C.hf,new E.e88(),C.uk,new E.e89(),C.kA,new E.e90(),C.Wn,new E.e91(),C.ur,new E.e92(),C.VN,new E.e93(),C.EV,new E.e94(),C.VI,new E.e95(),C.eh,new E.e96(),C.SA,new E.e97(),C.kV,new E.e98(),C.vp,new E.e99(),C.DY,new E.e100(),C.wT,new E.e101(),C.SR,new E.e102(),C.t6,new E.e103(),C.rP,new E.e104(),C.pX,new E.e105(),C.VD,new E.e106(),C.NN,new E.e107(),C.UX,new E.e108(),C.YS,new E.e109(),C.pu,new E.e110(),C.So,new E.e111(),C.EK,new E.e112(),C.td,new E.e113(),C.Gn,new E.e114(),C.zO,new E.e115(),C.eH,new E.e116(),C.ap,new E.e117(),C.Ys,new E.e118(),C.zm,new E.e119(),C.XM,new E.e120(),C.Ic,new E.e121(),C.yG,new E.e122(),C.tW,new E.e123(),C.CG,new E.e124(),C.vb,new E.e125(),C.UL,new E.e126(),C.QK,new E.e127(),C.AO,new E.e128(),C.xP,new E.e129(),C.Wm,new E.e130(),C.GR,new E.e131(),C.KX,new E.e132(),C.ja,new E.e133(),C.Dj,new E.e134(),C.Gi,new E.e135(),C.X2,new E.e136(),C.F3,new E.e137(),C.UY,new E.e138(),C.Aa,new E.e139(),C.nY,new E.e140(),C.HD,new E.e141(),C.iU,new E.e142(),C.eN,new E.e143(),C.ue,new E.e144(),C.nh,new E.e145(),C.L2,new E.e146(),C.Gs,new E.e147(),C.bE,new E.e148(),C.YD,new E.e149(),C.PX,new E.e150(),C.N8,new E.e151(),C.EA,new E.e152(),C.oW,new E.e153(),C.hd,new E.e154(),C.XY,new E.e155(),C.kz,new E.e156(),C.DW,new E.e157(),C.PM,new E.e158(),C.Nv,new E.e159(),C.TW,new E.e160(),C.xS,new E.e161(),C.mi,new E.e162(),C.zz,new E.e163(),C.hO,new E.e164(),C.ei,new E.e165(),C.HK,new E.e166(),C.je,new E.e167(),C.hN,new E.e168(),C.Q1,new E.e169(),C.ID,new E.e170(),C.z6,new E.e171(),C.bc,new E.e172(),C.kw,new E.e173(),C.ep,new E.e174(),C.J2,new E.e175(),C.zU,new E.e176(),C.bn,new E.e177(),C.mh,new E.e178(),C.Fh,new E.e179(),C.jh,new E.e180(),C.xw,new E.e181(),C.zn,new E.e182(),C.RJ,new E.e183(),C.Tc,new E.e184()],null,null)
-y=P.EF([C.aP,new E.e185(),C.cg,new E.e186(),C.j2,new E.e187(),C.S4,new E.e188(),C.AV,new E.e189(),C.bk,new E.e190(),C.lH,new E.e191(),C.kG,new E.e192(),C.XA,new E.e193(),C.i4,new E.e194(),C.bJ,new E.e195(),C.WZ,new E.e196(),C.VK,new E.e197(),C.aH,new E.e198(),C.PI,new E.e199(),C.Gr,new E.e200(),C.tP,new E.e201(),C.yh,new E.e202(),C.Zb,new E.e203(),C.ne,new E.e204(),C.B0,new E.e205(),C.mr,new E.e206(),C.YT,new E.e207(),C.WQ,new E.e208(),C.Gd,new E.e209(),C.QH,new E.e210(),C.rE,new E.e211(),C.nf,new E.e212(),C.Ql,new E.e213(),C.ak,new E.e214(),C.eo,new E.e215(),C.Ge,new E.e216(),C.He,new E.e217(),C.oj,new E.e218(),C.Ms,new E.e219(),C.d2,new E.e220(),C.fn,new E.e221(),C.Py,new E.e222(),C.uu,new E.e223(),C.qs,new E.e224(),C.a0,new E.e225(),C.rB,new E.e226(),C.Lc,new E.e227(),C.hf,new E.e228(),C.uk,new E.e229(),C.kA,new E.e230(),C.ur,new E.e231(),C.EV,new E.e232(),C.eh,new E.e233(),C.SA,new E.e234(),C.kV,new E.e235(),C.vp,new E.e236(),C.SR,new E.e237(),C.t6,new E.e238(),C.UX,new E.e239(),C.YS,new E.e240(),C.td,new E.e241(),C.zO,new E.e242(),C.Ys,new E.e243(),C.XM,new E.e244(),C.Ic,new E.e245(),C.tW,new E.e246(),C.vb,new E.e247(),C.QK,new E.e248(),C.AO,new E.e249(),C.xP,new E.e250(),C.GR,new E.e251(),C.KX,new E.e252(),C.ja,new E.e253(),C.Dj,new E.e254(),C.X2,new E.e255(),C.F3,new E.e256(),C.UY,new E.e257(),C.Aa,new E.e258(),C.nY,new E.e259(),C.HD,new E.e260(),C.iU,new E.e261(),C.eN,new E.e262(),C.Gs,new E.e263(),C.bE,new E.e264(),C.YD,new E.e265(),C.PX,new E.e266(),C.XY,new E.e267(),C.PM,new E.e268(),C.Nv,new E.e269(),C.TW,new E.e270(),C.mi,new E.e271(),C.zz,new E.e272(),C.z6,new E.e273(),C.kw,new E.e274(),C.zU,new E.e275(),C.RJ,new E.e276()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.bh,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.k5,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Wh,C.Mt,C.tU,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.BV,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.TU,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.Zj,C.Mt,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.hG,C.Vh,C.Mt,C.Zt,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.hG,C.Mt,C.l4,C.al,C.il],null,null)
-w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.h1,C.hf,C.n6],null,null),C.yS,P.EF([C.UX,C.X4],null,null),C.OG,C.CM,C.xE,P.EF([C.XA,C.CO],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.h9],null,null),C.bh,P.EF([C.PI,C.lg,C.Ms,C.Gl],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.h1,C.B0,C.Rf,C.r1,C.nP,C.mr,C.DC],null,null),C.KO,P.EF([C.yh,C.GE],null,null),C.wk,P.EF([C.AV,C.ti,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.h1,C.YT,C.V0,C.hf,C.n6,C.UY,C.rT],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.NA],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.VQ,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.Up,C.pO,C.au,C.Lc,C.Tt,C.AO,C.UE],null,null),C.iD,P.EF([C.QH,C.kt,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.dh,C.vb,C.eq,C.UL,C.mM],null,null),C.Wz,C.CM,C.k5,P.EF([C.fn,C.cV,C.XM,C.hL],null,null),C.qF,P.EF([C.vp,C.K9],null,null),C.nX,C.CM,C.Wh,P.EF([C.oj,C.dF],null,null),C.tU,P.EF([C.qs,C.ly],null,null),C.ce,P.EF([C.aH,C.hR,C.He,C.oV,C.vb,C.eq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bw,C.zz,C.lS],null,null),C.UJ,C.CM,C.BV,P.EF([C.bJ,C.iF,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.ZQ],null,null),C.j4,P.EF([C.rB,C.ZQ],null,null),C.TU,P.EF([C.rB,C.ZQ],null,null),C.CT,P.EF([C.rB,C.ZQ],null,null),C.mq,P.EF([C.rB,C.ZQ],null,null),C.Tq,P.EF([C.SR,C.HL,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.Ei],null,null),C.Ey,P.EF([C.XA,C.CO,C.uk,C.Mq],null,null),C.km,P.EF([C.rB,C.ZQ,C.bz,C.Bk,C.uk,C.Mq],null,null),C.vw,P.EF([C.uk,C.Mq,C.EV,C.Ei],null,null),C.Zj,P.EF([C.Ys,C.hK],null,null),C.ms,P.EF([C.cg,C.pU,C.uk,C.Mq,C.kV,C.Os],null,null),C.FA,P.EF([C.cg,C.pU,C.kV,C.Os],null,null),C.JW,P.EF([C.aP,C.xO,C.AV,C.h1,C.hf,C.n6],null,null),C.Mf,P.EF([C.uk,C.Mq],null,null),C.Dl,P.EF([C.j2,C.zJ,C.VK,C.m8],null,null),C.l4,C.CM,C.Vh,P.EF([C.j2,C.zJ],null,null),C.Zt,P.EF([C.WZ,C.Um,C.i0,C.GH,C.Gr,C.j3,C.SA,C.KI,C.tW,C.HM,C.CG,C.Ml,C.PX,C.Cj,C.N8,C.qE],null,null),C.Sb,P.EF([C.tW,C.HM,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.Cj,C.XY,C.ec,C.kz,C.db],null,null),C.wH,P.EF([C.yh,C.xQ],null,null),C.pK,P.EF([C.ne,C.l6],null,null),C.il,P.EF([C.uu,C.x3,C.xP,C.hI,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.No,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Nu,C.lH,C.A5,C.zU,C.IK],null,null),C.NR,P.EF([C.rE,C.Kv],null,null),C.vu,P.EF([C.kw,C.W9],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.yc,C.RJ,C.Ce],null,null)],null,null)
-v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.AV,"callback",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.kG,"classTable",C.OI,"classes",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.bJ,"counters",C.ox,"countersChanged",C.WZ,"coverage",C.i0,"coverageChanged",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.PI,"displayValue",C.aK,"doAction",C.GP,"element",C.Gr,"endPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.WQ,"field",C.Gd,"firstTokenPos",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.Uq,"getFormattedValue",C.A8,"getValue",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.ak,"hasParent",C.eo,"hashLink",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.wq,"hitStyle",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Ms,"iconClass",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.uu,"internal",C.qs,"io",C.h7,"ioEnabled",C.I9,"isBool",C.C1,"isComment",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.kA,"lastTokenPos",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.DY,"loading",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.So,"newHeapCapacity",C.EK,"newHeapUsed",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.eH,"oldHeapCapacity",C.ap,"oldHeapUsed",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.tW,"pos",C.CG,"posChanged",C.vb,"profile",C.UL,"profileChanged",C.QK,"qualified",C.AO,"qualifiedName",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.Gi,"relativeHashLink",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.XY,"showCoverage",C.kz,"showCoverageChanged",C.DW,"sortedRows",C.PM,"status",C.Nv,"subclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.hN,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.jh,"v",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName"],null,null),!1))
+E24:[function(){var z,y,x,w,v
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.WC,new E.wa(),C.S4,new E.Or(),C.Ro,new E.YL(),C.AV,new E.wf(),C.C0,new E.Oa(),C.eZ,new E.emv(),C.bk,new E.Lbd(),C.lH,new E.QAa(),C.kG,new E.CvS(),C.OI,new E.edy(),C.To,new E.waE(),C.XA,new E.Ore(),C.i4,new E.YLa(),C.qt,new E.wfa(),C.p1,new E.Oaa(),C.bJ,new E.e0(),C.ox,new E.e1(),C.WZ,new E.e2(),C.i0,new E.e3(),C.iE,new E.e4(),C.f4,new E.e5(),C.VK,new E.e6(),C.aH,new E.e7(),C.PI,new E.e8(),C.aK,new E.e9(),C.GP,new E.e10(),C.Gr,new E.e11(),C.tP,new E.e12(),C.yh,new E.e13(),C.Zb,new E.e14(),C.u7,new E.e15(),C.ne,new E.e16(),C.B0,new E.e17(),C.r1,new E.e18(),C.mr,new E.e19(),C.Ek,new E.e20(),C.Pn,new E.e21(),C.YT,new E.e22(),C.R3,new E.e23(),C.WQ,new E.e24(),C.jU,new E.e25(),C.Gd,new E.e26(),C.OO,new E.e27(),C.Mc,new E.e28(),C.FP,new E.e29(),C.kF,new E.e30(),C.UD,new E.e31(),C.Aq,new E.e32(),C.DS,new E.e33(),C.C9,new E.e34(),C.VF,new E.e35(),C.uU,new E.e36(),C.YJ,new E.e37(),C.eF,new E.e38(),C.oI,new E.e39(),C.ST,new E.e40(),C.QH,new E.e41(),C.qX,new E.e42(),C.rE,new E.e43(),C.nf,new E.e44(),C.pO,new E.e45(),C.EI,new E.e46(),C.JB,new E.e47(),C.Uq,new E.e48(),C.A8,new E.e49(),C.Ql,new E.e50(),C.SI,new E.e51(),C.zS,new E.e52(),C.ak,new E.e53(),C.eo,new E.e54(),C.Ge,new E.e55(),C.He,new E.e56(),C.wq,new E.e57(),C.k6,new E.e58(),C.oj,new E.e59(),C.PJ,new E.e60(),C.Ms,new E.e61(),C.q2,new E.e62(),C.d2,new E.e63(),C.kN,new E.e64(),C.fn,new E.e65(),C.eJ,new E.e66(),C.iG,new E.e67(),C.Py,new E.e68(),C.uu,new E.e69(),C.qs,new E.e70(),C.h7,new E.e71(),C.I9,new E.e72(),C.C1,new E.e73(),C.a0,new E.e74(),C.Yg,new E.e75(),C.bR,new E.e76(),C.ai,new E.e77(),C.ob,new E.e78(),C.Iv,new E.e79(),C.Wg,new E.e80(),C.tD,new E.e81(),C.nZ,new E.e82(),C.Of,new E.e83(),C.pY,new E.e84(),C.LA,new E.e85(),C.Lk,new E.e86(),C.dK,new E.e87(),C.xf,new E.e88(),C.rB,new E.e89(),C.bz,new E.e90(),C.Jx,new E.e91(),C.b5,new E.e92(),C.Lc,new E.e93(),C.hf,new E.e94(),C.uk,new E.e95(),C.kA,new E.e96(),C.Wn,new E.e97(),C.ur,new E.e98(),C.VN,new E.e99(),C.EV,new E.e100(),C.VI,new E.e101(),C.eh,new E.e102(),C.SA,new E.e103(),C.kV,new E.e104(),C.vp,new E.e105(),C.cc,new E.e106(),C.DY,new E.e107(),C.Lx,new E.e108(),C.M3,new E.e109(),C.wT,new E.e110(),C.SR,new E.e111(),C.t6,new E.e112(),C.rP,new E.e113(),C.pX,new E.e114(),C.VD,new E.e115(),C.NN,new E.e116(),C.UX,new E.e117(),C.YS,new E.e118(),C.pu,new E.e119(),C.So,new E.e120(),C.EK,new E.e121(),C.td,new E.e122(),C.Gn,new E.e123(),C.zO,new E.e124(),C.eH,new E.e125(),C.ap,new E.e126(),C.Ys,new E.e127(),C.zm,new E.e128(),C.XM,new E.e129(),C.Ic,new E.e130(),C.yG,new E.e131(),C.tW,new E.e132(),C.CG,new E.e133(),C.Wj,new E.e134(),C.vb,new E.e135(),C.UL,new E.e136(),C.AY,new E.e137(),C.QK,new E.e138(),C.AO,new E.e139(),C.I7,new E.e140(),C.xP,new E.e141(),C.Wm,new E.e142(),C.GR,new E.e143(),C.KX,new E.e144(),C.ja,new E.e145(),C.Dj,new E.e146(),C.Gi,new E.e147(),C.yL,new E.e148(),C.ni,new E.e149(),C.X2,new E.e150(),C.F3,new E.e151(),C.UY,new E.e152(),C.Aa,new E.e153(),C.nY,new E.e154(),C.HD,new E.e155(),C.iU,new E.e156(),C.eN,new E.e157(),C.ue,new E.e158(),C.nh,new E.e159(),C.L2,new E.e160(),C.Gs,new E.e161(),C.bE,new E.e162(),C.YD,new E.e163(),C.PX,new E.e164(),C.N8,new E.e165(),C.EA,new E.e166(),C.oW,new E.e167(),C.hd,new E.e168(),C.XY,new E.e169(),C.kz,new E.e170(),C.fV,new E.e171(),C.Ve,new E.e172(),C.jM,new E.e173(),C.DW,new E.e174(),C.PM,new E.e175(),C.Nv,new E.e176(),C.TW,new E.e177(),C.xS,new E.e178(),C.mi,new E.e179(),C.zz,new E.e180(),C.hO,new E.e181(),C.ei,new E.e182(),C.HK,new E.e183(),C.je,new E.e184(),C.hN,new E.e185(),C.Q1,new E.e186(),C.ID,new E.e187(),C.z6,new E.e188(),C.bc,new E.e189(),C.kw,new E.e190(),C.ep,new E.e191(),C.J2,new E.e192(),C.zU,new E.e193(),C.bn,new E.e194(),C.mh,new E.e195(),C.Fh,new E.e196(),C.jh,new E.e197(),C.fj,new E.e198(),C.xw,new E.e199(),C.zn,new E.e200(),C.RJ,new E.e201(),C.Tc,new E.e202(),C.YE,new E.e203(),C.Uy,new E.e204()],null,null)
+y=P.EF([C.aP,new E.e205(),C.cg,new E.e206(),C.j2,new E.e207(),C.S4,new E.e208(),C.AV,new E.e209(),C.bk,new E.e210(),C.lH,new E.e211(),C.kG,new E.e212(),C.XA,new E.e213(),C.i4,new E.e214(),C.bJ,new E.e215(),C.WZ,new E.e216(),C.VK,new E.e217(),C.aH,new E.e218(),C.PI,new E.e219(),C.Gr,new E.e220(),C.tP,new E.e221(),C.yh,new E.e222(),C.Zb,new E.e223(),C.ne,new E.e224(),C.B0,new E.e225(),C.mr,new E.e226(),C.YT,new E.e227(),C.WQ,new E.e228(),C.jU,new E.e229(),C.Gd,new E.e230(),C.OO,new E.e231(),C.Mc,new E.e232(),C.QH,new E.e233(),C.rE,new E.e234(),C.nf,new E.e235(),C.Ql,new E.e236(),C.ak,new E.e237(),C.eo,new E.e238(),C.Ge,new E.e239(),C.He,new E.e240(),C.oj,new E.e241(),C.Ms,new E.e242(),C.d2,new E.e243(),C.fn,new E.e244(),C.Py,new E.e245(),C.uu,new E.e246(),C.qs,new E.e247(),C.a0,new E.e248(),C.rB,new E.e249(),C.Lc,new E.e250(),C.hf,new E.e251(),C.uk,new E.e252(),C.kA,new E.e253(),C.ur,new E.e254(),C.EV,new E.e255(),C.eh,new E.e256(),C.SA,new E.e257(),C.kV,new E.e258(),C.vp,new E.e259(),C.SR,new E.e260(),C.t6,new E.e261(),C.UX,new E.e262(),C.YS,new E.e263(),C.td,new E.e264(),C.zO,new E.e265(),C.Ys,new E.e266(),C.XM,new E.e267(),C.Ic,new E.e268(),C.tW,new E.e269(),C.Wj,new E.e270(),C.vb,new E.e271(),C.QK,new E.e272(),C.AO,new E.e273(),C.xP,new E.e274(),C.GR,new E.e275(),C.KX,new E.e276(),C.ja,new E.e277(),C.Dj,new E.e278(),C.X2,new E.e279(),C.F3,new E.e280(),C.UY,new E.e281(),C.Aa,new E.e282(),C.nY,new E.e283(),C.HD,new E.e284(),C.iU,new E.e285(),C.eN,new E.e286(),C.Gs,new E.e287(),C.bE,new E.e288(),C.YD,new E.e289(),C.PX,new E.e290(),C.XY,new E.e291(),C.fV,new E.e292(),C.Ve,new E.e293(),C.jM,new E.e294(),C.PM,new E.e295(),C.Nv,new E.e296(),C.TW,new E.e297(),C.mi,new E.e298(),C.zz,new E.e299(),C.z6,new E.e300(),C.kw,new E.e301(),C.zU,new E.e302(),C.RJ,new E.e303(),C.YE,new E.e304()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.bh,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.BL,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.k5,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Wh,C.Mt,C.Ep,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.z7,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.TU,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.Zj,C.Mt,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.hG,C.Vh,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.hG,C.Mt,C.l4,C.al,C.il],null,null)
+w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.h1,C.hf,C.n6],null,null),C.yS,P.EF([C.UX,C.X4],null,null),C.OG,C.CM,C.xE,P.EF([C.XA,C.CO],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.h9],null,null),C.bh,P.EF([C.PI,C.lg,C.Ms,C.Gl],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.h1,C.B0,C.Rf,C.r1,C.nP,C.mr,C.DC],null,null),C.KO,P.EF([C.yh,C.GE],null,null),C.wk,P.EF([C.AV,C.ti,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.h1,C.YT,C.V0,C.hf,C.n6,C.UY,C.rT],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.NA],null,null),C.Vx,P.EF([C.OO,C.RM],null,null),C.BL,P.EF([C.Mc,C.XV],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.VQ,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.Up,C.pO,C.au,C.Lc,C.Tt,C.AO,C.UE],null,null),C.iD,P.EF([C.QH,C.kt,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.dh,C.vb,C.eq,C.UL,C.mM],null,null),C.Wz,C.CM,C.k5,P.EF([C.fn,C.cV,C.XM,C.hL],null,null),C.qF,P.EF([C.vp,C.K9],null,null),C.nX,C.CM,C.Wh,P.EF([C.oj,C.dF],null,null),C.Ep,P.EF([C.vp,C.K9],null,null),C.dD,P.EF([C.fV,C.CN],null,null),C.hP,P.EF([C.Wj,C.FN],null,null),C.tc,P.EF([C.vp,C.K9],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.v0],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.K9],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.Gg],null,null),C.tU,P.EF([C.qs,C.ly],null,null),C.DD,P.EF([C.vp,C.K9],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Xt],null,null),C.ce,P.EF([C.aH,C.hR,C.He,C.oV,C.vb,C.eq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bw,C.zz,C.lS],null,null),C.UJ,C.CM,C.z7,P.EF([C.bJ,C.iF,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.ZQ],null,null),C.j4,P.EF([C.rB,C.ZQ],null,null),C.TU,P.EF([C.rB,C.ZQ],null,null),C.CT,P.EF([C.rB,C.ZQ],null,null),C.mq,P.EF([C.rB,C.ZQ],null,null),C.Tq,P.EF([C.SR,C.HL,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.Ei],null,null),C.Ey,P.EF([C.XA,C.CO,C.uk,C.Mq],null,null),C.km,P.EF([C.rB,C.ZQ,C.bz,C.Bk,C.uk,C.Mq],null,null),C.vw,P.EF([C.uk,C.Mq,C.EV,C.Ei],null,null),C.Zj,P.EF([C.Ys,C.hK],null,null),C.ms,P.EF([C.cg,C.pU,C.uk,C.Mq,C.kV,C.Os],null,null),C.FA,P.EF([C.cg,C.pU,C.kV,C.Os],null,null),C.JW,P.EF([C.aP,C.xO,C.AV,C.h1,C.hf,C.n6],null,null),C.Mf,P.EF([C.uk,C.Mq],null,null),C.Dl,P.EF([C.j2,C.zJ,C.VK,C.m8],null,null),C.l4,C.CM,C.Vh,P.EF([C.j2,C.zJ],null,null),C.ON,P.EF([C.WZ,C.Um,C.i0,C.GH,C.Gr,C.j3,C.SA,C.KI,C.tW,C.HM,C.CG,C.Ml,C.PX,C.Cj,C.N8,C.qE],null,null),C.Sb,P.EF([C.tW,C.HM,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.Cj,C.XY,C.ec,C.kz,C.db],null,null),C.wH,P.EF([C.yh,C.xQ],null,null),C.pK,P.EF([C.ne,C.l6],null,null),C.il,P.EF([C.uu,C.x3,C.xP,C.hI,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.No,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Nu,C.lH,C.A5,C.zU,C.IK],null,null),C.NR,P.EF([C.rE,C.Kv],null,null),C.vu,P.EF([C.kw,C.W9],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.yc,C.RJ,C.Ce],null,null)],null,null)
+v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.AV,"callback",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.kG,"classTable",C.OI,"classes",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.bJ,"counters",C.ox,"countersChanged",C.WZ,"coverage",C.i0,"coverageChanged",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.PI,"displayValue",C.aK,"doAction",C.GP,"element",C.Gr,"endPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.R3,"fd",C.WQ,"field",C.jU,"file",C.Gd,"firstTokenPos",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.Uq,"getFormattedValue",C.A8,"getValue",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.ak,"hasParent",C.eo,"hashLink",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.wq,"hitStyle",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Ms,"iconClass",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.uu,"internal",C.qs,"io",C.h7,"ioEnabled",C.I9,"isBool",C.C1,"isComment",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.LA,"isPipe",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.kA,"lastTokenPos",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.So,"newHeapCapacity",C.EK,"newHeapUsed",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.eH,"oldHeapCapacity",C.ap,"oldHeapUsed",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.Gi,"relativeHashLink",C.yL,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.XY,"showCoverage",C.kz,"showCoverageChanged",C.fV,"small",C.Ve,"socket",C.jM,"socketOwner",C.DW,"sortedRows",C.PM,"status",C.Nv,"subclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.hN,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
 $.j8=new O.LT(z,y,C.CM)
 $.Yv=new O.bY(x,w,!1)
 $.qe=v
-A.X1([new E.e277(),new E.e278(),new E.e279(),new E.e280(),new E.e281(),new E.e282(),new E.e283(),new E.e284(),new E.e285(),new E.e286(),new E.e287(),new E.e288(),new E.e289(),new E.e290(),new E.e291(),new E.e292(),new E.e293(),new E.e294(),new E.e295(),new E.e296(),new E.e297(),new E.e298(),new E.e299(),new E.e300(),new E.e301(),new E.e302(),new E.e303(),new E.e304(),new E.e305(),new E.e306(),new E.e307(),new E.e308(),new E.e309(),new E.e310(),new E.e311(),new E.e312(),new E.e313(),new E.e314(),new E.e315(),new E.e316(),new E.e317(),new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333(),F.wV()],!0)},"$0","Tb",0,0,15],
+$.M6=[new E.e305(),new E.e306(),new E.e307(),new E.e308(),new E.e309(),new E.e310(),new E.e311(),new E.e312(),new E.e313(),new E.e314(),new E.e315(),new E.e316(),new E.e317(),new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333(),new E.e334(),new E.e335(),new E.e336(),new E.e337(),new E.e338(),new E.e339(),new E.e340(),new E.e341(),new E.e342(),new E.e343(),new E.e344(),new E.e345(),new E.e346(),new E.e347(),new E.e348(),new E.e349(),new E.e350(),new E.e351(),new E.e352(),new E.e353(),new E.e354(),new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376()]
+$.UG=!0
+F.E2()},"$0","vS",0,0,15],
 em:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.Jp(a)},
 $isEH:true},
 Lb:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return a.gYu()},
 $isEH:true},
 QA:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.Ln(a)},
 $isEH:true},
 Cv:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.un(a)},
 $isEH:true},
 ed:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return a.gA3()},
 $isEH:true},
 wa:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return a.gqr()},
 $isEH:true},
 Or:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.nG(a)},
 $isEH:true},
 YL:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.aA(a)},
 $isEH:true},
 wf:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.WT(a)},
 $isEH:true},
 Oa:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.Wp(a)},
 $isEH:true},
 emv:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.n9(a)},
 $isEH:true},
 Lbd:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.K0(a)},
 $isEH:true},
 QAa:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.hn(a)},
 $isEH:true},
 CvS:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.yz(a)},
 $isEH:true},
 edy:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.pP(a)},
 $isEH:true},
 waE:{
-"^":"Xs:10;",
-$1:function(a){return J.E3(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gaP()},
 $isEH:true},
 Ore:{
-"^":"Xs:10;",
-$1:function(a){return J.on(a)},
+"^":"Tp:10;",
+$1:function(a){return J.E3(a)},
 $isEH:true},
 YLa:{
-"^":"Xs:10;",
-$1:function(a){return J.SM(a)},
+"^":"Tp:10;",
+$1:function(a){return J.on(a)},
 $isEH:true},
 wfa:{
-"^":"Xs:10;",
-$1:function(a){return a.goH()},
+"^":"Tp:10;",
+$1:function(a){return J.SM(a)},
 $isEH:true},
 Oaa:{
-"^":"Xs:10;",
-$1:function(a){return J.zD(a)},
+"^":"Tp:10;",
+$1:function(a){return a.goH()},
 $isEH:true},
 e0:{
-"^":"Xs:10;",
-$1:function(a){return J.Ok(a)},
+"^":"Tp:10;",
+$1:function(a){return J.OT(a)},
 $isEH:true},
 e1:{
-"^":"Xs:10;",
-$1:function(a){return J.wd(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Ok(a)},
 $isEH:true},
 e2:{
-"^":"Xs:10;",
-$1:function(a){return J.RC(a)},
+"^":"Tp:10;",
+$1:function(a){return J.wd(a)},
 $isEH:true},
 e3:{
-"^":"Xs:10;",
-$1:function(a){return a.gSL()},
+"^":"Tp:10;",
+$1:function(a){return J.RC(a)},
 $isEH:true},
 e4:{
-"^":"Xs:10;",
-$1:function(a){return a.guH()},
+"^":"Tp:10;",
+$1:function(a){return a.gSL()},
 $isEH:true},
 e5:{
-"^":"Xs:10;",
-$1:function(a){return J.mP(a)},
+"^":"Tp:10;",
+$1:function(a){return a.guH()},
 $isEH:true},
 e6:{
-"^":"Xs:10;",
-$1:function(a){return J.BT(a)},
+"^":"Tp:10;",
+$1:function(a){return J.mP(a)},
 $isEH:true},
 e7:{
-"^":"Xs:10;",
-$1:function(a){return J.yA(a)},
+"^":"Tp:10;",
+$1:function(a){return J.BT(a)},
 $isEH:true},
 e8:{
-"^":"Xs:10;",
-$1:function(a){return J.vi(a)},
+"^":"Tp:10;",
+$1:function(a){return J.yA(a)},
 $isEH:true},
 e9:{
-"^":"Xs:10;",
-$1:function(a){return a.gFL()},
+"^":"Tp:10;",
+$1:function(a){return J.vi(a)},
 $isEH:true},
 e10:{
-"^":"Xs:10;",
-$1:function(a){return J.rw(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gFL()},
 $isEH:true},
 e11:{
-"^":"Xs:10;",
-$1:function(a){return a.gw2()},
+"^":"Tp:10;",
+$1:function(a){return J.rw(a)},
 $isEH:true},
 e12:{
-"^":"Xs:10;",
-$1:function(a){return J.w8(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gw2()},
 $isEH:true},
 e13:{
-"^":"Xs:10;",
-$1:function(a){return J.is(a)},
+"^":"Tp:10;",
+$1:function(a){return J.w8(a)},
 $isEH:true},
 e14:{
-"^":"Xs:10;",
-$1:function(a){return J.yi(a)},
+"^":"Tp:10;",
+$1:function(a){return J.is(a)},
 $isEH:true},
 e15:{
-"^":"Xs:10;",
-$1:function(a){return J.Vl(a)},
+"^":"Tp:10;",
+$1:function(a){return J.yi(a)},
 $isEH:true},
 e16:{
-"^":"Xs:10;",
-$1:function(a){return J.kE(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Vl(a)},
 $isEH:true},
 e17:{
-"^":"Xs:10;",
-$1:function(a){return J.Ak(a)},
+"^":"Tp:10;",
+$1:function(a){return J.kE(a)},
 $isEH:true},
 e18:{
-"^":"Xs:10;",
-$1:function(a){return J.Mz(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Ak(a)},
 $isEH:true},
 e19:{
-"^":"Xs:10;",
-$1:function(a){return J.S9(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Mz(a)},
 $isEH:true},
 e20:{
-"^":"Xs:10;",
-$1:function(a){return a.gty()},
+"^":"Tp:10;",
+$1:function(a){return J.S9(a)},
 $isEH:true},
 e21:{
-"^":"Xs:10;",
-$1:function(a){return J.yn(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gty()},
 $isEH:true},
 e22:{
-"^":"Xs:10;",
-$1:function(a){return J.pm(a)},
+"^":"Tp:10;",
+$1:function(a){return J.yn(a)},
 $isEH:true},
 e23:{
-"^":"Xs:10;",
-$1:function(a){return a.ghY()},
+"^":"Tp:10;",
+$1:function(a){return a.gkE()},
 $isEH:true},
 e24:{
-"^":"Xs:10;",
-$1:function(a){return J.WX(a)},
+"^":"Tp:10;",
+$1:function(a){return J.pm(a)},
 $isEH:true},
 e25:{
-"^":"Xs:10;",
-$1:function(a){return J.JD(a)},
+"^":"Tp:10;",
+$1:function(a){return J.WA(a)},
 $isEH:true},
 e26:{
-"^":"Xs:10;",
-$1:function(a){return a.gZd()},
+"^":"Tp:10;",
+$1:function(a){return a.ghY()},
 $isEH:true},
 e27:{
-"^":"Xs:10;",
-$1:function(a){return J.lT(a)},
+"^":"Tp:10;",
+$1:function(a){return J.ra(a)},
 $isEH:true},
 e28:{
-"^":"Xs:10;",
-$1:function(a){return J.M4(a)},
+"^":"Tp:10;",
+$1:function(a){return J.QZ(a)},
 $isEH:true},
 e29:{
-"^":"Xs:10;",
-$1:function(a){return a.gkA()},
+"^":"Tp:10;",
+$1:function(a){return J.WX(a)},
 $isEH:true},
 e30:{
-"^":"Xs:10;",
-$1:function(a){return a.gGK()},
+"^":"Tp:10;",
+$1:function(a){return J.JD(a)},
 $isEH:true},
 e31:{
-"^":"Xs:10;",
-$1:function(a){return a.gan()},
+"^":"Tp:10;",
+$1:function(a){return a.gZd()},
 $isEH:true},
 e32:{
-"^":"Xs:10;",
-$1:function(a){return a.gcQ()},
+"^":"Tp:10;",
+$1:function(a){return J.lT(a)},
 $isEH:true},
 e33:{
-"^":"Xs:10;",
-$1:function(a){return a.gS7()},
+"^":"Tp:10;",
+$1:function(a){return J.M4(a)},
 $isEH:true},
 e34:{
-"^":"Xs:10;",
-$1:function(a){return a.gP3()},
+"^":"Tp:10;",
+$1:function(a){return a.gkA()},
 $isEH:true},
 e35:{
-"^":"Xs:10;",
-$1:function(a){return J.PY(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gGK()},
 $isEH:true},
 e36:{
-"^":"Xs:10;",
-$1:function(a){return J.bu(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gan()},
 $isEH:true},
 e37:{
-"^":"Xs:10;",
-$1:function(a){return J.VL(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gcQ()},
 $isEH:true},
 e38:{
-"^":"Xs:10;",
-$1:function(a){return J.zN(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gS7()},
 $isEH:true},
 e39:{
-"^":"Xs:10;",
-$1:function(a){return J.FI(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gP3()},
 $isEH:true},
 e40:{
-"^":"Xs:10;",
-$1:function(a){return J.WY(a)},
+"^":"Tp:10;",
+$1:function(a){return J.PY(a)},
 $isEH:true},
 e41:{
-"^":"Xs:10;",
-$1:function(a){return a.gmu()},
+"^":"Tp:10;",
+$1:function(a){return J.bu(a)},
 $isEH:true},
 e42:{
-"^":"Xs:10;",
-$1:function(a){return a.gCO()},
+"^":"Tp:10;",
+$1:function(a){return J.VL(a)},
 $isEH:true},
 e43:{
-"^":"Xs:10;",
-$1:function(a){return a.gwy()},
+"^":"Tp:10;",
+$1:function(a){return J.zN(a)},
 $isEH:true},
 e44:{
-"^":"Xs:10;",
-$1:function(a){return a.gyY()},
+"^":"Tp:10;",
+$1:function(a){return J.m4(a)},
 $isEH:true},
 e45:{
-"^":"Xs:10;",
-$1:function(a){return J.wO(a)},
+"^":"Tp:10;",
+$1:function(a){return J.WY(a)},
 $isEH:true},
 e46:{
-"^":"Xs:10;",
-$1:function(a){return a.gGf()},
+"^":"Tp:10;",
+$1:function(a){return a.gmu()},
 $isEH:true},
 e47:{
-"^":"Xs:10;",
-$1:function(a){return a.gUa()},
+"^":"Tp:10;",
+$1:function(a){return a.gCO()},
 $isEH:true},
 e48:{
-"^":"Xs:10;",
-$1:function(a){return J.Mb(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gwy()},
 $isEH:true},
 e49:{
-"^":"Xs:10;",
-$1:function(a){return a.gHP()},
+"^":"Tp:10;",
+$1:function(a){return a.gyY()},
 $isEH:true},
 e50:{
-"^":"Xs:10;",
-$1:function(a){return J.z3(a)},
+"^":"Tp:10;",
+$1:function(a){return J.wO(a)},
 $isEH:true},
 e51:{
-"^":"Xs:10;",
-$1:function(a){return J.yZ(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gGf()},
 $isEH:true},
 e52:{
-"^":"Xs:10;",
-$1:function(a){return J.Hr(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gUa()},
 $isEH:true},
 e53:{
-"^":"Xs:10;",
-$1:function(a){return J.fA(a)},
+"^":"Tp:10;",
+$1:function(a){return J.u1(a)},
 $isEH:true},
 e54:{
-"^":"Xs:10;",
-$1:function(a){return J.cd(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gHP()},
 $isEH:true},
 e55:{
-"^":"Xs:10;",
-$1:function(a){return a.gL4()},
+"^":"Tp:10;",
+$1:function(a){return J.z3(a)},
 $isEH:true},
 e56:{
-"^":"Xs:10;",
-$1:function(a){return J.pB(a)},
+"^":"Tp:10;",
+$1:function(a){return J.YQ(a)},
 $isEH:true},
 e57:{
-"^":"Xs:10;",
-$1:function(a){return a.gaj()},
+"^":"Tp:10;",
+$1:function(a){return J.Hr(a)},
 $isEH:true},
 e58:{
-"^":"Xs:10;",
-$1:function(a){return a.giq()},
+"^":"Tp:10;",
+$1:function(a){return J.fA(a)},
 $isEH:true},
 e59:{
-"^":"Xs:10;",
-$1:function(a){return a.gBm()},
+"^":"Tp:10;",
+$1:function(a){return J.cd(a)},
 $isEH:true},
 e60:{
-"^":"Xs:10;",
-$1:function(a){return J.xR(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gL4()},
 $isEH:true},
 e61:{
-"^":"Xs:10;",
-$1:function(a){return a.gNI()},
+"^":"Tp:10;",
+$1:function(a){return J.pB(a)},
 $isEH:true},
 e62:{
-"^":"Xs:10;",
-$1:function(a){return a.gva()},
+"^":"Tp:10;",
+$1:function(a){return a.gaj()},
 $isEH:true},
 e63:{
-"^":"Xs:10;",
-$1:function(a){return a.gKt()},
+"^":"Tp:10;",
+$1:function(a){return a.giq()},
 $isEH:true},
 e64:{
-"^":"Xs:10;",
-$1:function(a){return J.ns(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gBm()},
 $isEH:true},
 e65:{
-"^":"Xs:10;",
-$1:function(a){return J.Ew(a)},
+"^":"Tp:10;",
+$1:function(a){return J.xR(a)},
 $isEH:true},
 e66:{
-"^":"Xs:10;",
-$1:function(a){return a.gwg()},
+"^":"Tp:10;",
+$1:function(a){return a.gNI()},
 $isEH:true},
 e67:{
-"^":"Xs:10;",
-$1:function(a){return J.Ja(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gva()},
 $isEH:true},
 e68:{
-"^":"Xs:10;",
-$1:function(a){return a.gUB()},
+"^":"Tp:10;",
+$1:function(a){return a.gKt()},
 $isEH:true},
 e69:{
-"^":"Xs:10;",
-$1:function(a){return J.To(a)},
+"^":"Tp:10;",
+$1:function(a){return J.ns(a)},
 $isEH:true},
 e70:{
-"^":"Xs:10;",
-$1:function(a){return a.gkU()},
+"^":"Tp:10;",
+$1:function(a){return J.Ew(a)},
 $isEH:true},
 e71:{
-"^":"Xs:10;",
-$1:function(a){return J.wz(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gwg()},
 $isEH:true},
 e72:{
-"^":"Xs:10;",
-$1:function(a){return J.FN(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Ja(a)},
 $isEH:true},
 e73:{
-"^":"Xs:10;",
-$1:function(a){return J.ls(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gUB()},
 $isEH:true},
 e74:{
-"^":"Xs:10;",
-$1:function(a){return J.yq(a)},
+"^":"Tp:10;",
+$1:function(a){return J.pd(a)},
 $isEH:true},
 e75:{
-"^":"Xs:10;",
-$1:function(a){return J.SZ(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gkU()},
 $isEH:true},
 e76:{
-"^":"Xs:10;",
-$1:function(a){return J.DL(a)},
+"^":"Tp:10;",
+$1:function(a){return J.wz(a)},
 $isEH:true},
 e77:{
-"^":"Xs:10;",
-$1:function(a){return J.yx(a)},
+"^":"Tp:10;",
+$1:function(a){return J.tx(a)},
 $isEH:true},
 e78:{
-"^":"Xs:10;",
-$1:function(a){return J.cU(a)},
+"^":"Tp:10;",
+$1:function(a){return J.ls(a)},
 $isEH:true},
 e79:{
-"^":"Xs:10;",
-$1:function(a){return a.gYG()},
+"^":"Tp:10;",
+$1:function(a){return J.yq(a)},
 $isEH:true},
 e80:{
-"^":"Xs:10;",
-$1:function(a){return J.UM(a)},
+"^":"Tp:10;",
+$1:function(a){return J.SZ(a)},
 $isEH:true},
 e81:{
-"^":"Xs:10;",
-$1:function(a){return J.ZN(a)},
+"^":"Tp:10;",
+$1:function(a){return J.DL(a)},
 $isEH:true},
 e82:{
-"^":"Xs:10;",
-$1:function(a){return J.xa(a)},
+"^":"Tp:10;",
+$1:function(a){return J.yx(a)},
 $isEH:true},
 e83:{
-"^":"Xs:10;",
-$1:function(a){return J.aT(a)},
+"^":"Tp:10;",
+$1:function(a){return J.cU(a)},
 $isEH:true},
 e84:{
-"^":"Xs:10;",
-$1:function(a){return J.hb(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gYG()},
 $isEH:true},
 e85:{
-"^":"Xs:10;",
-$1:function(a){return a.gi2()},
+"^":"Tp:10;",
+$1:function(a){return a.gHY()},
 $isEH:true},
 e86:{
-"^":"Xs:10;",
-$1:function(a){return a.gEB()},
+"^":"Tp:10;",
+$1:function(a){return J.UM(a)},
 $isEH:true},
 e87:{
-"^":"Xs:10;",
-$1:function(a){return J.Iz(a)},
+"^":"Tp:10;",
+$1:function(a){return J.ZN(a)},
 $isEH:true},
 e88:{
-"^":"Xs:10;",
-$1:function(a){return J.Q4(a)},
+"^":"Tp:10;",
+$1:function(a){return J.xa(a)},
 $isEH:true},
 e89:{
-"^":"Xs:10;",
-$1:function(a){return J.MQ(a)},
+"^":"Tp:10;",
+$1:function(a){return J.aT(a)},
 $isEH:true},
 e90:{
-"^":"Xs:10;",
-$1:function(a){return a.gSK()},
+"^":"Tp:10;",
+$1:function(a){return J.hb(a)},
 $isEH:true},
 e91:{
-"^":"Xs:10;",
-$1:function(a){return J.q8(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gi2()},
 $isEH:true},
 e92:{
-"^":"Xs:10;",
-$1:function(a){return a.ghX()},
+"^":"Tp:10;",
+$1:function(a){return a.gEB()},
 $isEH:true},
 e93:{
-"^":"Xs:10;",
-$1:function(a){return a.gvU()},
+"^":"Tp:10;",
+$1:function(a){return J.Iz(a)},
 $isEH:true},
 e94:{
-"^":"Xs:10;",
-$1:function(a){return J.IJ(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Q4(a)},
 $isEH:true},
 e95:{
-"^":"Xs:10;",
-$1:function(a){return a.gRd()},
+"^":"Tp:10;",
+$1:function(a){return J.MQ(a)},
 $isEH:true},
 e96:{
-"^":"Xs:10;",
-$1:function(a){return J.zY(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gSK()},
 $isEH:true},
 e97:{
-"^":"Xs:10;",
-$1:function(a){return J.de(a)},
+"^":"Tp:10;",
+$1:function(a){return J.q8(a)},
 $isEH:true},
 e98:{
-"^":"Xs:10;",
-$1:function(a){return J.Ds(a)},
+"^":"Tp:10;",
+$1:function(a){return a.ghX()},
 $isEH:true},
 e99:{
-"^":"Xs:10;",
-$1:function(a){return J.cO(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gvU()},
 $isEH:true},
 e100:{
-"^":"Xs:10;",
-$1:function(a){return a.gn0()},
+"^":"Tp:10;",
+$1:function(a){return J.jl(a)},
 $isEH:true},
 e101:{
-"^":"Xs:10;",
-$1:function(a){return a.geH()},
+"^":"Tp:10;",
+$1:function(a){return a.gRd()},
 $isEH:true},
 e102:{
-"^":"Xs:10;",
-$1:function(a){return J.Yf(a)},
+"^":"Tp:10;",
+$1:function(a){return J.zY(a)},
 $isEH:true},
 e103:{
-"^":"Xs:10;",
-$1:function(a){return J.kv(a)},
+"^":"Tp:10;",
+$1:function(a){return J.de(a)},
 $isEH:true},
 e104:{
-"^":"Xs:10;",
-$1:function(a){return J.QD(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Ds(a)},
 $isEH:true},
 e105:{
-"^":"Xs:10;",
-$1:function(a){return J.z2(a)},
+"^":"Tp:10;",
+$1:function(a){return J.cO(a)},
 $isEH:true},
 e106:{
-"^":"Xs:10;",
-$1:function(a){return J.ZL(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gzM()},
 $isEH:true},
 e107:{
-"^":"Xs:10;",
-$1:function(a){return J.ba(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gn0()},
 $isEH:true},
 e108:{
-"^":"Xs:10;",
-$1:function(a){return J.Zv(a)},
+"^":"Tp:10;",
+$1:function(a){return a.giP()},
 $isEH:true},
 e109:{
-"^":"Xs:10;",
-$1:function(a){return J.O6(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gLw()},
 $isEH:true},
 e110:{
-"^":"Xs:10;",
-$1:function(a){return J.yK(a)},
+"^":"Tp:10;",
+$1:function(a){return a.geH()},
 $isEH:true},
 e111:{
-"^":"Xs:10;",
-$1:function(a){return a.gxs()},
+"^":"Tp:10;",
+$1:function(a){return J.Yf(a)},
 $isEH:true},
 e112:{
-"^":"Xs:10;",
-$1:function(a){return a.gCi()},
+"^":"Tp:10;",
+$1:function(a){return J.kv(a)},
 $isEH:true},
 e113:{
-"^":"Xs:10;",
-$1:function(a){return J.Jj(a)},
+"^":"Tp:10;",
+$1:function(a){return J.ih(a)},
 $isEH:true},
 e114:{
-"^":"Xs:10;",
-$1:function(a){return J.t8(a)},
+"^":"Tp:10;",
+$1:function(a){return J.z2(a)},
 $isEH:true},
 e115:{
-"^":"Xs:10;",
-$1:function(a){return a.gL1()},
+"^":"Tp:10;",
+$1:function(a){return J.ZL(a)},
 $isEH:true},
 e116:{
-"^":"Xs:10;",
-$1:function(a){return a.gQB()},
+"^":"Tp:10;",
+$1:function(a){return J.ba(a)},
 $isEH:true},
 e117:{
-"^":"Xs:10;",
-$1:function(a){return a.guq()},
+"^":"Tp:10;",
+$1:function(a){return J.Zv(a)},
 $isEH:true},
 e118:{
-"^":"Xs:10;",
-$1:function(a){return J.EC(a)},
+"^":"Tp:10;",
+$1:function(a){return J.O6(a)},
 $isEH:true},
 e119:{
-"^":"Xs:10;",
-$1:function(a){return J.JG(a)},
+"^":"Tp:10;",
+$1:function(a){return J.HO(a)},
 $isEH:true},
 e120:{
-"^":"Xs:10;",
-$1:function(a){return J.AF(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gxs()},
 $isEH:true},
 e121:{
-"^":"Xs:10;",
-$1:function(a){return J.LB(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gCi()},
 $isEH:true},
 e122:{
-"^":"Xs:10;",
-$1:function(a){return J.Kl(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Jj(a)},
 $isEH:true},
 e123:{
-"^":"Xs:10;",
-$1:function(a){return J.io(a)},
+"^":"Tp:10;",
+$1:function(a){return J.t8(a)},
 $isEH:true},
 e124:{
-"^":"Xs:10;",
-$1:function(a){return J.Ff(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gL1()},
 $isEH:true},
 e125:{
-"^":"Xs:10;",
-$1:function(a){return J.ks(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gQB()},
 $isEH:true},
 e126:{
-"^":"Xs:10;",
-$1:function(a){return J.CN(a)},
+"^":"Tp:10;",
+$1:function(a){return a.guq()},
 $isEH:true},
 e127:{
-"^":"Xs:10;",
-$1:function(a){return J.Pr(a)},
+"^":"Tp:10;",
+$1:function(a){return J.EC(a)},
 $isEH:true},
 e128:{
-"^":"Xs:10;",
-$1:function(a){return J.Sz(a)},
+"^":"Tp:10;",
+$1:function(a){return J.JG(a)},
 $isEH:true},
 e129:{
-"^":"Xs:10;",
-$1:function(a){return J.Gc(a)},
+"^":"Tp:10;",
+$1:function(a){return J.AF(a)},
 $isEH:true},
 e130:{
-"^":"Xs:10;",
-$1:function(a){return J.Dd(a)},
+"^":"Tp:10;",
+$1:function(a){return J.LB(a)},
 $isEH:true},
 e131:{
-"^":"Xs:10;",
-$1:function(a){return J.OP(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Kl(a)},
 $isEH:true},
 e132:{
-"^":"Xs:10;",
-$1:function(a){return J.zv(a)},
+"^":"Tp:10;",
+$1:function(a){return J.io(a)},
 $isEH:true},
 e133:{
-"^":"Xs:10;",
-$1:function(a){return J.tF(a)},
+"^":"Tp:10;",
+$1:function(a){return J.fy(a)},
 $isEH:true},
 e134:{
-"^":"Xs:10;",
-$1:function(a){return J.QX(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Qa(a)},
 $isEH:true},
 e135:{
-"^":"Xs:10;",
-$1:function(a){return a.gw6()},
+"^":"Tp:10;",
+$1:function(a){return J.ks(a)},
 $isEH:true},
 e136:{
-"^":"Xs:10;",
-$1:function(a){return J.iL(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Hf(a)},
 $isEH:true},
 e137:{
-"^":"Xs:10;",
-$1:function(a){return J.jP(a)},
+"^":"Tp:10;",
+$1:function(a){return J.WM(a)},
 $isEH:true},
 e138:{
-"^":"Xs:10;",
-$1:function(a){return J.uW(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Pr(a)},
 $isEH:true},
 e139:{
-"^":"Xs:10;",
-$1:function(a){return J.W2(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Sz(a)},
 $isEH:true},
 e140:{
-"^":"Xs:10;",
-$1:function(a){return J.UT(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gm8()},
 $isEH:true},
 e141:{
-"^":"Xs:10;",
-$1:function(a){return J.jH(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Gc(a)},
 $isEH:true},
 e142:{
-"^":"Xs:10;",
-$1:function(a){return J.jo(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Dd(a)},
 $isEH:true},
 e143:{
-"^":"Xs:10;",
-$1:function(a){return a.gVc()},
+"^":"Tp:10;",
+$1:function(a){return J.Cm(a)},
 $isEH:true},
 e144:{
-"^":"Xs:10;",
-$1:function(a){return a.gpF()},
+"^":"Tp:10;",
+$1:function(a){return J.AK(a)},
 $isEH:true},
 e145:{
-"^":"Xs:10;",
-$1:function(a){return J.oL(a)},
+"^":"Tp:10;",
+$1:function(a){return J.tF(a)},
 $isEH:true},
 e146:{
-"^":"Xs:10;",
-$1:function(a){return a.gA6()},
+"^":"Tp:10;",
+$1:function(a){return J.QX(a)},
 $isEH:true},
 e147:{
-"^":"Xs:10;",
-$1:function(a){return J.Ry(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gw6()},
 $isEH:true},
 e148:{
-"^":"Xs:10;",
-$1:function(a){return J.UP(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gNS()},
 $isEH:true},
 e149:{
-"^":"Xs:10;",
-$1:function(a){return J.fw(a)},
+"^":"Tp:10;",
+$1:function(a){return a.guh()},
 $isEH:true},
 e150:{
-"^":"Xs:10;",
-$1:function(a){return J.zH(a)},
+"^":"Tp:10;",
+$1:function(a){return J.iL(a)},
 $isEH:true},
 e151:{
-"^":"Xs:10;",
-$1:function(a){return J.Vi(a)},
+"^":"Tp:10;",
+$1:function(a){return J.jP(a)},
 $isEH:true},
 e152:{
-"^":"Xs:10;",
-$1:function(a){return a.ghp()},
+"^":"Tp:10;",
+$1:function(a){return J.uW(a)},
 $isEH:true},
 e153:{
-"^":"Xs:10;",
-$1:function(a){return J.P5(a)},
+"^":"Tp:10;",
+$1:function(a){return J.W2(a)},
 $isEH:true},
 e154:{
-"^":"Xs:10;",
-$1:function(a){return a.gzS()},
+"^":"Tp:10;",
+$1:function(a){return J.UT(a)},
 $isEH:true},
 e155:{
-"^":"Xs:10;",
-$1:function(a){return J.iY(a)},
+"^":"Tp:10;",
+$1:function(a){return J.jH(a)},
 $isEH:true},
 e156:{
-"^":"Xs:10;",
-$1:function(a){return J.kS(a)},
+"^":"Tp:10;",
+$1:function(a){return J.jo(a)},
 $isEH:true},
 e157:{
-"^":"Xs:10;",
-$1:function(a){return a.gGD()},
+"^":"Tp:10;",
+$1:function(a){return a.gVc()},
 $isEH:true},
 e158:{
-"^":"Xs:10;",
-$1:function(a){return J.Td(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gpF()},
 $isEH:true},
 e159:{
-"^":"Xs:10;",
-$1:function(a){return a.gDo()},
+"^":"Tp:10;",
+$1:function(a){return J.oL(a)},
 $isEH:true},
 e160:{
-"^":"Xs:10;",
-$1:function(a){return J.j1(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gA6()},
 $isEH:true},
 e161:{
-"^":"Xs:10;",
-$1:function(a){return J.Aw(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Ry(a)},
 $isEH:true},
 e162:{
-"^":"Xs:10;",
-$1:function(a){return J.dY(a)},
+"^":"Tp:10;",
+$1:function(a){return J.UP(a)},
 $isEH:true},
 e163:{
-"^":"Xs:10;",
-$1:function(a){return J.OL(a)},
+"^":"Tp:10;",
+$1:function(a){return J.fw(a)},
 $isEH:true},
 e164:{
-"^":"Xs:10;",
-$1:function(a){return a.gki()},
+"^":"Tp:10;",
+$1:function(a){return J.zH(a)},
 $isEH:true},
 e165:{
-"^":"Xs:10;",
-$1:function(a){return a.gZn()},
+"^":"Tp:10;",
+$1:function(a){return J.Vi(a)},
 $isEH:true},
 e166:{
-"^":"Xs:10;",
-$1:function(a){return a.gvs()},
+"^":"Tp:10;",
+$1:function(a){return a.gXR()},
 $isEH:true},
 e167:{
-"^":"Xs:10;",
-$1:function(a){return a.gVh()},
+"^":"Tp:10;",
+$1:function(a){return J.P5(a)},
 $isEH:true},
 e168:{
-"^":"Xs:10;",
-$1:function(a){return a.gZX()},
+"^":"Tp:10;",
+$1:function(a){return a.gzS()},
 $isEH:true},
 e169:{
-"^":"Xs:10;",
-$1:function(a){return J.SG(a)},
+"^":"Tp:10;",
+$1:function(a){return J.iY(a)},
 $isEH:true},
 e170:{
-"^":"Xs:10;",
-$1:function(a){return J.eU(a)},
+"^":"Tp:10;",
+$1:function(a){return J.u9(a)},
 $isEH:true},
 e171:{
-"^":"Xs:10;",
-$1:function(a){return a.gVF()},
+"^":"Tp:10;",
+$1:function(a){return J.U8(a)},
 $isEH:true},
 e172:{
-"^":"Xs:10;",
-$1:function(a){return a.gkw()},
+"^":"Tp:10;",
+$1:function(a){return J.oN(a)},
 $isEH:true},
 e173:{
-"^":"Xs:10;",
-$1:function(a){return J.K2(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gV8()},
 $isEH:true},
 e174:{
-"^":"Xs:10;",
-$1:function(a){return J.uy(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gGD()},
 $isEH:true},
 e175:{
-"^":"Xs:10;",
-$1:function(a){return a.gEy()},
+"^":"Tp:10;",
+$1:function(a){return J.Td(a)},
 $isEH:true},
 e176:{
-"^":"Xs:10;",
-$1:function(a){return J.Kd(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gDo()},
 $isEH:true},
 e177:{
-"^":"Xs:10;",
-$1:function(a){return J.Sl(a)},
+"^":"Tp:10;",
+$1:function(a){return J.j1(a)},
 $isEH:true},
 e178:{
-"^":"Xs:10;",
-$1:function(a){return a.gJk()},
+"^":"Tp:10;",
+$1:function(a){return J.Aw(a)},
 $isEH:true},
 e179:{
-"^":"Xs:10;",
-$1:function(a){return J.Nl(a)},
+"^":"Tp:10;",
+$1:function(a){return J.dY(a)},
 $isEH:true},
 e180:{
-"^":"Xs:10;",
-$1:function(a){return a.gFc()},
+"^":"Tp:10;",
+$1:function(a){return J.OL(a)},
 $isEH:true},
 e181:{
-"^":"Xs:10;",
-$1:function(a){return a.gZ3()},
+"^":"Tp:10;",
+$1:function(a){return a.gki()},
 $isEH:true},
 e182:{
-"^":"Xs:10;",
-$1:function(a){return a.gYe()},
+"^":"Tp:10;",
+$1:function(a){return a.gZn()},
 $isEH:true},
 e183:{
-"^":"Xs:10;",
-$1:function(a){return J.I2(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gvs()},
 $isEH:true},
 e184:{
-"^":"Xs:10;",
-$1:function(a){return a.gzz()},
+"^":"Tp:10;",
+$1:function(a){return a.gVh()},
 $isEH:true},
 e185:{
-"^":"Xs:51;",
-$2:function(a,b){J.Ex(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gZX()},
 $isEH:true},
 e186:{
-"^":"Xs:51;",
-$2:function(a,b){J.a8(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.SG(a)},
 $isEH:true},
 e187:{
-"^":"Xs:51;",
-$2:function(a,b){J.oO(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.eU(a)},
 $isEH:true},
 e188:{
-"^":"Xs:51;",
-$2:function(a,b){J.l7(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gVF()},
 $isEH:true},
 e189:{
-"^":"Xs:51;",
-$2:function(a,b){J.kB(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gkw()},
 $isEH:true},
 e190:{
-"^":"Xs:51;",
-$2:function(a,b){J.Ae(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.K2(a)},
 $isEH:true},
 e191:{
-"^":"Xs:51;",
-$2:function(a,b){J.IX(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.uy(a)},
 $isEH:true},
 e192:{
-"^":"Xs:51;",
-$2:function(a,b){J.WI(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gEy()},
 $isEH:true},
 e193:{
-"^":"Xs:51;",
-$2:function(a,b){J.o0(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.Kd(a)},
 $isEH:true},
 e194:{
-"^":"Xs:51;",
-$2:function(a,b){J.fH(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.Sl(a)},
 $isEH:true},
 e195:{
-"^":"Xs:51;",
-$2:function(a,b){J.Fg(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gJk()},
 $isEH:true},
 e196:{
-"^":"Xs:51;",
-$2:function(a,b){J.qA(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.Nl(a)},
 $isEH:true},
 e197:{
-"^":"Xs:51;",
-$2:function(a,b){J.LM(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gFc()},
 $isEH:true},
 e198:{
-"^":"Xs:51;",
-$2:function(a,b){J.qq(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gYY()},
 $isEH:true},
 e199:{
-"^":"Xs:51;",
-$2:function(a,b){J.Pk(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gZ3()},
 $isEH:true},
 e200:{
-"^":"Xs:51;",
-$2:function(a,b){J.Yz(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gYe()},
 $isEH:true},
 e201:{
-"^":"Xs:51;",
-$2:function(a,b){a.sw2(b)},
+"^":"Tp:10;",
+$1:function(a){return J.I2(a)},
 $isEH:true},
 e202:{
-"^":"Xs:51;",
-$2:function(a,b){J.Qr(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gzz()},
 $isEH:true},
 e203:{
-"^":"Xs:51;",
-$2:function(a,b){J.xW(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.tp(a)},
 $isEH:true},
 e204:{
-"^":"Xs:51;",
-$2:function(a,b){J.BC(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gaU()},
 $isEH:true},
 e205:{
-"^":"Xs:51;",
-$2:function(a,b){J.VJ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.RX(a,b)},
 $isEH:true},
 e206:{
-"^":"Xs:51;",
-$2:function(a,b){J.NO(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.a8(a,b)},
 $isEH:true},
 e207:{
-"^":"Xs:51;",
-$2:function(a,b){J.WB(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.oO(a,b)},
 $isEH:true},
 e208:{
-"^":"Xs:51;",
-$2:function(a,b){J.JZ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.l7(a,b)},
 $isEH:true},
 e209:{
-"^":"Xs:51;",
-$2:function(a,b){a.shY(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.kB(a,b)},
 $isEH:true},
 e210:{
-"^":"Xs:51;",
-$2:function(a,b){J.Nf(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Ae(a,b)},
 $isEH:true},
 e211:{
-"^":"Xs:51;",
-$2:function(a,b){J.Pl(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.IX(a,b)},
 $isEH:true},
 e212:{
-"^":"Xs:51;",
-$2:function(a,b){J.Mu(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.WI(a,b)},
 $isEH:true},
 e213:{
-"^":"Xs:51;",
-$2:function(a,b){J.xH(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.o0(a,b)},
 $isEH:true},
 e214:{
-"^":"Xs:51;",
-$2:function(a,b){J.o2(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.fH(a,b)},
 $isEH:true},
 e215:{
-"^":"Xs:51;",
-$2:function(a,b){a.sHP(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Sf(a,b)},
 $isEH:true},
 e216:{
-"^":"Xs:51;",
-$2:function(a,b){J.AI(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.qA(a,b)},
 $isEH:true},
 e217:{
-"^":"Xs:51;",
-$2:function(a,b){J.LI(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.LM(a,b)},
 $isEH:true},
 e218:{
-"^":"Xs:51;",
-$2:function(a,b){J.fb(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.qq(a,b)},
 $isEH:true},
 e219:{
-"^":"Xs:51;",
-$2:function(a,b){J.Dz(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Pk(a,b)},
 $isEH:true},
 e220:{
-"^":"Xs:51;",
-$2:function(a,b){a.siq(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Yz(a,b)},
 $isEH:true},
 e221:{
-"^":"Xs:51;",
-$2:function(a,b){J.Qy(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.sw2(b)},
 $isEH:true},
 e222:{
-"^":"Xs:51;",
-$2:function(a,b){a.sKt(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Qr(a,b)},
 $isEH:true},
 e223:{
-"^":"Xs:51;",
-$2:function(a,b){J.hQ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.xW(a,b)},
 $isEH:true},
 e224:{
-"^":"Xs:51;",
-$2:function(a,b){J.mU(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.BC(a,b)},
 $isEH:true},
 e225:{
-"^":"Xs:51;",
-$2:function(a,b){J.T3(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.VJ(a,b)},
 $isEH:true},
 e226:{
-"^":"Xs:51;",
-$2:function(a,b){J.uM(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.NO(a,b)},
 $isEH:true},
 e227:{
-"^":"Xs:51;",
-$2:function(a,b){J.Er(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.WB(a,b)},
 $isEH:true},
 e228:{
-"^":"Xs:51;",
-$2:function(a,b){J.uX(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.JZ(a,b)},
 $isEH:true},
 e229:{
-"^":"Xs:51;",
-$2:function(a,b){J.hS(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.fR(a,b)},
 $isEH:true},
 e230:{
-"^":"Xs:51;",
-$2:function(a,b){a.sSK(b)},
+"^":"Tp:67;",
+$2:function(a,b){a.shY(b)},
 $isEH:true},
 e231:{
-"^":"Xs:51;",
-$2:function(a,b){a.shX(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.LP(a,b)},
 $isEH:true},
 e232:{
-"^":"Xs:51;",
-$2:function(a,b){J.cl(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.GF(a,b)},
 $isEH:true},
 e233:{
-"^":"Xs:51;",
-$2:function(a,b){J.Jb(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Nf(a,b)},
 $isEH:true},
 e234:{
-"^":"Xs:51;",
-$2:function(a,b){J.k7(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Pl(a,b)},
 $isEH:true},
 e235:{
-"^":"Xs:51;",
-$2:function(a,b){J.jM(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.C3(a,b)},
 $isEH:true},
 e236:{
-"^":"Xs:51;",
-$2:function(a,b){J.A4(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.xH(a,b)},
 $isEH:true},
 e237:{
-"^":"Xs:51;",
-$2:function(a,b){J.wD(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Nh(a,b)},
 $isEH:true},
 e238:{
-"^":"Xs:51;",
-$2:function(a,b){J.wJ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.sHP(b)},
 $isEH:true},
 e239:{
-"^":"Xs:51;",
-$2:function(a,b){J.oJ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.AI(a,b)},
 $isEH:true},
 e240:{
-"^":"Xs:51;",
-$2:function(a,b){J.DF(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.nA(a,b)},
 $isEH:true},
 e241:{
-"^":"Xs:51;",
-$2:function(a,b){J.Mi(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.fb(a,b)},
 $isEH:true},
 e242:{
-"^":"Xs:51;",
-$2:function(a,b){a.sL1(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.tv(a,b)},
 $isEH:true},
 e243:{
-"^":"Xs:51;",
-$2:function(a,b){J.XF(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.siq(b)},
 $isEH:true},
 e244:{
-"^":"Xs:51;",
-$2:function(a,b){J.SF(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Qy(a,b)},
 $isEH:true},
 e245:{
-"^":"Xs:51;",
-$2:function(a,b){J.Qv(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.sKt(b)},
 $isEH:true},
 e246:{
-"^":"Xs:51;",
-$2:function(a,b){J.Xg(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Oo(a,b)},
 $isEH:true},
 e247:{
-"^":"Xs:51;",
-$2:function(a,b){J.CJ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.mU(a,b)},
 $isEH:true},
 e248:{
-"^":"Xs:51;",
-$2:function(a,b){J.El(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Kz(a,b)},
 $isEH:true},
 e249:{
-"^":"Xs:51;",
-$2:function(a,b){J.fv(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.uM(a,b)},
 $isEH:true},
 e250:{
-"^":"Xs:51;",
-$2:function(a,b){J.PP(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Er(a,b)},
 $isEH:true},
 e251:{
-"^":"Xs:51;",
-$2:function(a,b){J.yk(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.uX(a,b)},
 $isEH:true},
 e252:{
-"^":"Xs:51;",
-$2:function(a,b){J.TR(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.hS(a,b)},
 $isEH:true},
 e253:{
-"^":"Xs:51;",
-$2:function(a,b){J.w7(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.sSK(b)},
 $isEH:true},
 e254:{
-"^":"Xs:51;",
-$2:function(a,b){J.ME(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.shX(b)},
 $isEH:true},
 e255:{
-"^":"Xs:51;",
-$2:function(a,b){J.kX(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.cl(a,b)},
 $isEH:true},
 e256:{
-"^":"Xs:51;",
-$2:function(a,b){J.S5(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Jb(a,b)},
 $isEH:true},
 e257:{
-"^":"Xs:51;",
-$2:function(a,b){J.q0(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.k7(a,b)},
 $isEH:true},
 e258:{
-"^":"Xs:51;",
-$2:function(a,b){J.EJ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.MX(a,b)},
 $isEH:true},
 e259:{
-"^":"Xs:51;",
-$2:function(a,b){J.ND(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.A4(a,b)},
 $isEH:true},
 e260:{
-"^":"Xs:51;",
-$2:function(a,b){J.B9(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.wD(a,b)},
 $isEH:true},
 e261:{
-"^":"Xs:51;",
-$2:function(a,b){J.PN(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.wJ(a,b)},
 $isEH:true},
 e262:{
-"^":"Xs:51;",
-$2:function(a,b){a.sVc(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.oJ(a,b)},
 $isEH:true},
 e263:{
-"^":"Xs:51;",
-$2:function(a,b){J.By(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.DF(a,b)},
 $isEH:true},
 e264:{
-"^":"Xs:51;",
-$2:function(a,b){J.jd(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Mi(a,b)},
 $isEH:true},
 e265:{
-"^":"Xs:51;",
-$2:function(a,b){J.Rx(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.sL1(b)},
 $isEH:true},
 e266:{
-"^":"Xs:51;",
-$2:function(a,b){J.ZI(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.XF(a,b)},
 $isEH:true},
 e267:{
-"^":"Xs:51;",
-$2:function(a,b){J.wg(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.SF(a,b)},
 $isEH:true},
 e268:{
-"^":"Xs:51;",
-$2:function(a,b){J.Tx(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Qv(a,b)},
 $isEH:true},
 e269:{
-"^":"Xs:51;",
-$2:function(a,b){a.sDo(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Xg(a,b)},
 $isEH:true},
 e270:{
-"^":"Xs:51;",
-$2:function(a,b){J.H3(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.aw(a,b)},
 $isEH:true},
 e271:{
-"^":"Xs:51;",
-$2:function(a,b){J.t3(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.CJ(a,b)},
 $isEH:true},
 e272:{
-"^":"Xs:51;",
-$2:function(a,b){J.GT(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.P2(a,b)},
 $isEH:true},
 e273:{
-"^":"Xs:51;",
-$2:function(a,b){a.sVF(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.fv(a,b)},
 $isEH:true},
 e274:{
-"^":"Xs:51;",
-$2:function(a,b){J.yO(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.PP(a,b)},
 $isEH:true},
 e275:{
-"^":"Xs:51;",
-$2:function(a,b){J.ZU(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Sj(a,b)},
 $isEH:true},
 e276:{
-"^":"Xs:51;",
-$2:function(a,b){J.tQ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.AJ(a,b)},
 $isEH:true},
 e277:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.w7(a,b)},
 $isEH:true},
 e278:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.ME(a,b)},
 $isEH:true},
 e279:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.kX(a,b)},
 $isEH:true},
 e280:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.S5(a,b)},
 $isEH:true},
 e281:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.q0(a,b)},
 $isEH:true},
 e282:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("nav-bar",C.Zj)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.EJ(a,b)},
 $isEH:true},
 e283:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.iH(a,b)},
 $isEH:true},
 e284:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.B9(a,b)},
 $isEH:true},
 e285:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.PN(a,b)},
 $isEH:true},
 e286:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){a.sVc(b)},
 $isEH:true},
 e287:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.By(a,b)},
 $isEH:true},
 e288:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.jd(a,b)},
 $isEH:true},
 e289:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.Rx(a,b)},
 $isEH:true},
 e290:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.ZI(a,b)},
 $isEH:true},
 e291:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.wg(a,b)},
 $isEH:true},
 e292:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.fa(a,b)},
 $isEH:true},
 e293:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.Cu(a,b)},
 $isEH:true},
 e294:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){a.sV8(b)},
 $isEH:true},
 e295:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.Tx(a,b)},
 $isEH:true},
 e296:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){a.sDo(b)},
 $isEH:true},
 e297:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.H3(a,b)},
 $isEH:true},
 e298:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.t3(a,b)},
 $isEH:true},
 e299:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.GT(a,b)},
 $isEH:true},
 e300:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){a.sVF(b)},
 $isEH:true},
 e301:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("collapsible-content",C.bh)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.yO(a,b)},
 $isEH:true},
 e302:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.ZU(a,b)},
 $isEH:true},
 e303:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.tQ(a,b)},
 $isEH:true},
 e304:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("script-inset",C.Zt)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.tH(a,b)},
 $isEH:true},
 e305:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e306:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e307:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e308:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e309:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e310:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("io-http-server-view",C.Wh)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("nav-bar",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e311:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e312:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e313:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e314:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e315:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.TU)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e316:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.BV)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e317:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e318:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("instance-view",C.k5)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e319:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e320:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e321:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e322:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e323:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e324:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e325:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e326:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e327:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e328:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e329:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("response-viewer",C.Vh)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("collapsible-content",C.bh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e330:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e331:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e332:{
-"^":"Xs:42;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e333:{
-"^":"Xs:42;",
+"^":"Tp:64;",
+$0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e334:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e335:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e336:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e337:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e338:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e339:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e340:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e341:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e342:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-http-server-view",C.Wh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e343:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e344:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e345:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e346:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e347:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e348:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e349:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e350:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e351:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e352:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e353:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e354:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e355:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e356:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e357:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e358:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e359:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-shared-summary",C.TU)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e360:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-counter-chart",C.z7)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e361:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e362:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("instance-view",C.k5)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e363:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e364:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e365:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e366:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e367:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e368:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e369:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e370:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e371:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e372:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("response-viewer",C.Vh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e373:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e374:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e375:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e376:{
+"^":"Tp:64;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
 $isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
@@ -3736,9 +3916,9 @@
 "^":"Vf;BW,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 grs:function(a){return a.BW},
 srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-RF:[function(a,b){J.LE(a.BW).wM(b)},"$1","gVm",2,0,17,66],
-static:{Dw:function(a){var z,y,x,w
-z=$.J1()
+RF:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,17,82],
+static:{KU:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3756,7 +3936,7 @@
 eW:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 static:{rt:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3770,14 +3950,14 @@
 return a}}}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 aC:{
-"^":"Vfx;lb,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gRu:function(a){return a.lb},
-sRu:function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},
-vV:[function(a,b){return J.aT(a.lb).cv(J.ew(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,67,68],
-S1:[function(a,b){return J.aT(a.lb).cv(J.ew(J.F8(a.lb),"/retained"))},"$1","ghN",2,0,67,69],
-RF:[function(a,b){J.LE(a.lb).wM(b)},"$1","gVm",2,0,17,66],
+"^":"Vfx;yB,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gRu:function(a){return a.yB},
+sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
+vV:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,83,84],
+S1:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/retained"))},"$1","ghN",2,0,83,85],
+RF:[function(a,b){J.LE(a.yB).wM(b)},"$1","gvC",2,0,17,82],
 static:{zg:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3796,9 +3976,9 @@
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gtT:function(a){return a.tY},
 Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gLe",2,0,10,35],
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,10,54],
 static:{On:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3819,8 +3999,8 @@
 Z.uL.prototype.q0.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.Ma())},
-RF:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gVm",2,0,17,66],
+J.SK(z).ml(new F.aa())},
+RF:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,17,82],
 m2:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
@@ -3830,12 +4010,12 @@
 return x},
 YI:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gKJ",6,0,70,1,71,72],
+J.pP(z).h(0,"highlight")},"$3","gKJ",6,0,86,1,87,88],
 ZC:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,70,1,71,72],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,86,1,87,88],
 static:{f9:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3849,9 +4029,9 @@
 Dsd:{
 "^":"uL+Pi;",
 $isd3:true},
-Ma:{
-"^":"Xs:73;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,56,"call"],
+aa:{
+"^":"Tp:89;",
+$1:[function(a){a.OF()},"$1",null,2,0,null,72,"call"],
 $isEH:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
@@ -3866,8 +4046,8 @@
 if(a.P2){a.Xf=this.ct(a,C.Ms,z,"glyphicon glyphicon-chevron-down")
 a.VA=this.ct(a,C.PI,a.VA,"none")}else{a.Xf=this.ct(a,C.Ms,z,"glyphicon glyphicon-chevron-up")
 a.VA=this.ct(a,C.PI,a.VA,"block")}},
-static:{"^":"A2,DI",IT:function(a){var z,y,x,w
-z=$.J1()
+static:{"^":"ALz,DI",IT:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3886,7 +4066,7 @@
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 JI:{
-"^":"Nr;GV,uo,nx,oM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"Xfs;GV,uo,nx,oM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 goE:function(a){return a.GV},
 soE:function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},
 gv8:function(a){return a.uo},
@@ -3898,7 +4078,7 @@
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
 na:[function(a,b){var z=a.oM
-a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,17,35],
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,17,54],
 Db:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
 a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,15],
@@ -3906,9 +4086,9 @@
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.gN2(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,55,24,25,56],
-static:{p7:function(a){var z,y,x,w
-z=$.J1()
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,71,43,44,72],
+static:{U9:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3923,27 +4103,18 @@
 C.O0.ZL(a)
 C.O0.XI(a)
 return a}}},
-Nr:{
+Xfs:{
 "^":"ir+Pi;",
 $isd3:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
 bQ:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
-Ck:function(a,b){var z
+qo:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
 return!1},
 n3:function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
 return b},
-mx:function(a,b,c){var z,y,x
-for(y=0;x=$.oM(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
-z=P.p9("")
-try{$.oM().push(a)
-z.KF(b)
-z.We(a,", ")
-z.KF(c)}finally{x=$.oM()
-if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},
 rd:function(a,b){if(b==null)b=P.n4()
 H.ZE(a,0,a.length-1,b)},
 xF:function(a,b,c){var z=J.Wx(b)
@@ -3977,7 +4148,7 @@
 for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.ew(b,1)
 C.Nm.u(a,b,v)}},
-xr:function(a,b,c){var z,y
+aB: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.mY(c);z.G();b=y){y=b+1
 C.Nm.u(a,b,z.gl())}},
@@ -4142,7 +4313,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.lJ(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.cX,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},48],
+ez:[function(a,b){return H.VM(new H.lJ(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},28],
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -4220,24 +4391,24 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return J.q8(this.l6)},
-gl0:function(a){return J.FN(this.l6)},
+gl0:function(a){return J.tx(this.l6)},
 grZ:function(a){return this.mb(J.MQ(this.l6))},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 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",
 $isyN:true},
 MH:{
-"^":"AC;lo,OI,T6",
+"^":"Yl;lo,OI,T6",
 mb:function(a){return this.T6.$1(a)},
 G:function(){var z=this.OI
 if(z.G()){this.lo=this.mb(z.gl())
 return!0}this.lo=null
 return!1},
 gl:function(){return this.lo},
-$asAC:function(a,b){return[b]}},
+$asYl:function(a,b){return[b]}},
 lJ:{
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.$1(a)},
@@ -4245,7 +4416,7 @@
 Zv:function(a,b){return this.mb(J.i9(this.CR,b))},
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 $isyN:true},
 U5:{
 "^":"mW;l6,T6",
@@ -4253,19 +4424,19 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 SO:{
-"^":"AC;OI,T6",
+"^":"Yl;OI,T6",
 mb:function(a){return this.T6.$1(a)},
 G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
 return!1},
 gl:function(){return this.OI.gl()}},
 zs:{
 "^":"mW;l6,T6",
-gA:function(a){var z=new H.rR(J.mY(this.l6),this.T6,C.Gw,null)
+gA:function(a){var z=new H.yY(J.mY(this.l6),this.T6,C.Gw,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]}},
-rR:{
+$asQV:function(a,b){return[b]}},
+yY:{
 "^":"a;OI,T6,e0,lo",
 mb:function(a){return this.T6.$1(a)},
 gl:function(){return this.lo},
@@ -4285,7 +4456,7 @@
 "^":"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"))},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
@@ -4294,9 +4465,9 @@
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+Yj:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 XP:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
@@ -4308,15 +4479,15 @@
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
-XC:{
+$isQV:true,
+$asQV:null},
+w2Y:{
 "^":"rm+JJ;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 iK:{
 "^":"aL;CR",
 gB:function(a){return J.q8(this.CR)},
@@ -4343,16 +4514,15 @@
 z.fixed$length=init
 return z}}],["dart.async","dart:async",,P,{
 "^":"",
-C2:function(){if($.jk().scheduleImmediate!=null)return P.vd()
-return P.a3()},
+xg:function(){if($.jk().scheduleImmediate!=null)return P.vd()
+return P.K7()},
 ZV:[function(a){++init.globalState.Xz.GL
 $.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,16],
-Hk:[function(a){P.jL(C.ny,a)},"$1","a3",2,0,16],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,16],
 VH:function(a,b){var z=H.G3()
 z=H.KT(z,[z,z]).BD(a)
-if(z){b.toString
-return a}else{b.toString
-return a}},
+if(z)return b.O8(a)
+else return b.wY(a)},
 Iw:function(a,b){var z=P.Dt(b)
 P.ww(C.ny,new P.w4(a,z))
 return z},
@@ -4373,10 +4543,10 @@
 $.ej().$1(P.rh())}else{y=new P.OM(a,null)
 z.aw=y
 $.k8=y}},
-rb:function(a){var z=$.X3
-if(z===C.NU){z.toString
-P.Tk(z,null,z,a)
-return}P.Tk(z,null,z,z.xi(a,!0))},
+rb:function(a){var z
+if(J.xC($.X3,C.NU)){$.X3.wr(a)
+return}z=$.X3
+z.wr(z.xi(a,!0))},
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -4389,53 +4559,59 @@
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-v=$.X3
-v.toString
-P.CK(v,null,v,y,x)}},
-YE:[function(a){},"$1","bZ",2,0,17,18],
-XH:[function(a,b){var z=$.X3
-z.toString
-P.CK(z,null,z,a,b)},function(a){return P.XH(a,null)},null,"$2","$1","vD",2,2,19,20,21,22],
-dL:[function(){},"$0","v3",0,0,15],
+x=new H.XO(w,null)
+$.X3.hk(y,x)}},
+SN:[function(a){},"$1","Ax",2,0,17,18],
+vF:[function(a,b){$.X3.hk(a,b)},function(a){return P.vF(a,null)},null,"$2","$1","Mm",2,2,19,20,21,22],
+p0:[function(){},"$0","od",0,0,15],
 FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
+y=new H.XO(x,null)
 c.$2(z,y)}},
 NX:function(a,b,c,d){a.ed()
 b.K5(c,d)},
 TB:function(a,b){return new P.uR(a,b)},
 Bb:function(a,b,c){a.ed()
 b.rX(c)},
-ww:function(a,b){var z=$.X3
-if(z===C.NU){z.toString
-return P.h8(z,null,z,a,b)}return P.h8(z,null,z,a,z.xi(b,!0))},
-jL:function(a,b){var z=C.CD.cU(a.Fq,1000)
+ww:function(a,b){var z
+if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
+z=$.X3
+return z.uN(a,z.xi(b,!0))},
+jL:function(a,b){var z=a.gVs()
 return H.cy(z<0?0:z,b)},
 Us:function(a){var z=$.X3
 $.X3=a
 return z},
-CK:function(a,b,c,d,e){P.T8(a,null,a,new P.FO(d,e))},
-T8:function(a,b,c,d){var z,y
-if($.X3===c)return d.$0()
+CK:[function(a,b,c,d,e){a.Gr(new P.FO(d,e))},"$5","wL",10,0,23,24,25,26,21,22],
+T8:[function(a,b,c,d){var z,y
+if(J.xC($.X3,c))return d.$0()
 z=P.Us(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},
-V7:function(a,b,c,d,e){var z,y
-if($.X3===c)return d.$1(e)
+return y}finally{$.X3=z}},"$4","lw",8,0,27,24,25,26,28],
+V7:[function(a,b,c,d,e){var z,y
+if(J.xC($.X3,c))return d.$1(e)
 z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},
-BD:function(a,b,c,d,e,f){var z,y
-if($.X3===c)return d.$2(e,f)
+return y}finally{$.X3=z}},"$5","MM",10,0,29,24,25,26,28,30],
+Mu:[function(a,b,c,d,e,f){var z,y
+if(J.xC($.X3,c))return d.$2(e,f)
 z=P.Us(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},
-Tk:function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},
-h8:function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},
+return y}finally{$.X3=z}},"$6","iy",12,0,31,24,25,26,28,6,7],
+Ee:[function(a,b,c,d){return d},"$4","Qk",8,0,32,24,25,26,28],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,33,24,25,26,28],
+dL:[function(a,b,c,d){return d},"$4","v3",8,0,34,24,25,26,28],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,35],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,36,24,25,26,37,38],
+XB:[function(a,b,c,d){H.qw(d)},"$4","aW",8,0,39],
+CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,40],
+UA:[function(a,b,c,d,e){var z
+$.oK=P.jt()
+z=P.YM(null,null,null,null,null)
+return new P.uo(c,d,z)},"$5","Is",10,0,41],
 C6:{
-"^":"Xs:42;a",
+"^":"Tp:64;a",
 $0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -4444,8 +4620,8 @@
 $isXS:true},
 Ik:{
 "^":"O9;Y8"},
-f6:{
-"^":"oh;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
+LR:{
+"^":"oh;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,nb",
 gY8:function(){return this.Y8},
 uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
@@ -4464,7 +4640,7 @@
 return(z&4)!==0},
 uO:[function(){},"$0","gp4",0,0,15],
 LP:[function(){},"$0","gZ9",0,0,15],
-static:{"^":"FJ,H6,id"}},
+static:{"^":"E2b,H6,id"}},
 WV:{
 "^":"a;iE@,SJ@",
 gUF:function(){return!1},
@@ -4487,10 +4663,10 @@
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WV")},74],
-zw:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.NA(a,b)},function(a){return this.zw(a,null)},"JT","$2","$1","gGj",2,2,75,20,21,22],
-xO:function(a){var z,y
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WV")},90],
+js:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
+this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,91,20,21,22],
+S6:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.yx
 if(z>=4)throw H.b(this.q7())
@@ -4499,7 +4675,7 @@
 this.Pl()
 return y},
 Rg:function(a){this.Iv(a)},
-V8:function(a,b){this.NA(a,b)},
+oJ:function(a,b){this.pb(a,b)},
 YB:function(){var z=this.WX
 this.WX=null
 this.Gv&=4294967287
@@ -4525,9 +4701,9 @@
 this.Gv&=4294967293
 if(this.iE===this)this.Of()},
 Of:function(){if((this.Gv&4)!==0&&this.yx.Gv===0)this.yx.OH(null)
-P.ot(this.QC)}},
+P.ot(this.Ym)}},
 zW:{
-"^":"WV;nL,QC,Gv,iE,SJ,WX,yx",
+"^":"WV;nL,Ym,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv|=2
@@ -4535,45 +4711,45 @@
 this.Gv&=4294967293
 if(this.iE===this)this.Of()
 return}this.nE(new P.tK(this,a))},
-NA:function(a,b){if(this.iE===this)return
+pb:function(a,b){if(this.iE===this)return
 this.nE(new P.OR(this,a,b))},
 Pl:function(){if(this.iE!==this)this.nE(new P.eB(this))
 else this.yx.OH(null)}},
 tK:{
-"^":"Xs;a,b",
+"^":"Tp;a,b",
 $1:function(a){a.Rg(this.b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 OR:{
-"^":"Xs;a,b,c",
-$1:function(a){a.V8(this.b,this.c)},
+"^":"Tp;a,b,c",
+$1:function(a){a.oJ(this.b,this.c)},
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 eB:{
-"^":"Xs;a",
+"^":"Tp;a",
 $1:function(a){a.YB()},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.f6,a]]}},this.a,"zW")}},
+$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.LR,a]]}},this.a,"zW")}},
 HX:{
-"^":"WV;nL,QC,Gv,iE,SJ,WX,yx",
+"^":"WV;nL,Ym,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
 y.$builtinTypeInfo=[null]
 z.VI(y)}},
-NA:function(a,b){var z
+pb:function(a,b){var z
 for(z=this.iE;z!==this;z=z.giE())z.VI(new P.WG(a,b,null))},
 Pl:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.VI(C.Wj)
+if(z!==this)for(;z!==this;z=z.giE())z.VI(C.ZB)
 else this.yx.OH(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
 w4:{
-"^":"Xs:42;a,b",
+"^":"Tp:64;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
+y=new H.XO(x,null)
 this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 Pf0:{
@@ -4582,18 +4758,18 @@
 "^":"Pf0;MM",
 j3:[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.j3(a,null)},"tZ","$1","$0","gv6",0,2,76,20,18],
+z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,92,20,18],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"rC","$2","$1","gYJ",2,2,75,20,21,22]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"rC","$2","$1","gXN",2,2,91,20,21,22]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
 gWj:function(){return this.Gv===4},
 gNm:function(){return this.Gv===8},
-snc:function(a){if(a)this.Gv=2
+swG:function(a){if(a)this.Gv=2
 else this.Gv=0},
 gO1:function(){return this.Gv===2?null:this.OY},
 gyK:function(){return this.Gv===2?null:this.As},
@@ -4601,23 +4777,20 @@
 gIa:function(){return this.Gv===2?null:this.o4},
 Rx:function(a,b){var z,y
 z=$.X3
-z.toString
-y=H.VM(new P.vs(0,z,null,null,a,null,P.VH(b,z),null),[null])
+y=H.VM(new P.vs(0,z,null,null,z.wY(a),null,P.VH(b,$.X3),null),[null])
 this.au(y)
 return y},
 ml:function(a){return this.Rx(a,null)},
 co:function(a,b){var z,y,x
 z=$.X3
 y=P.VH(a,z)
-$.X3.toString
-x=H.VM(new P.vs(0,z,null,null,null,b,y,null),[null])
+x=H.VM(new P.vs(0,z,null,null,null,$.X3.wY(b),y,null),[null])
 this.au(x)
 return x},
 OA:function(a){return this.co(a,null)},
 wM:function(a){var z,y
 z=$.X3
-z.toString
-y=new P.vs(0,z,null,null,null,null,null,a)
+y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
 return y},
@@ -4627,10 +4800,8 @@
 this.jk=a},
 E6:function(a,b){this.Gv=8
 this.jk=new P.Ca(a,b)},
-au:function(a){var z
-if(this.Gv>=4){z=this.Lj
-z.toString
-P.Tk(z,null,z,new P.da(this,a))}else{a.sBQ(this.jk)
+au:function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
+else{a.sBQ(this.jk)
 this.jk=a}},
 L3:function(){var z,y,x
 z=this.jk
@@ -4655,196 +4826,164 @@
 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
-z=this.Lj
-z.toString
-P.Tk(z,null,z,new P.eX(this,a))}else P.A9(a,this)}else P.k3(a,this)
+this.Lj.wr(new P.cX(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
-z=this.Lj
-z.toString
-P.Tk(z,null,z,new P.pZ(this,a))},
-CG:function(a,b){var z
-if(this.Gv!==0)H.vh(P.w("Future already completed"))
+this.Lj.wr(new P.eX(this,a))},
+CG:function(a,b){if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
-z=this.Lj
-z.toString
-P.Tk(z,null,z,new P.In(this,a,b))},
-L7:function(a,b){this.OH(a)},
+this.Lj.wr(new P.In(this,a,b))},
+J9:function(a,b){this.OH(a)},
 X8:function(a,b,c){this.CG(a,b)},
 $isvs:true,
 $isb8:true,
 static:{"^":"ewM,JE,C3n,Xh,NKU",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},PG:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
-z.L7(a,b)
+z.J9(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
-return z},k3:function(a,b){b.snc(!0)
-a.Rx(new P.pV(b),new P.U7(b))},A9:function(a,b){b.snc(!0)
+return z},k3:function(a,b){b.swG(!0)
+a.Rx(new P.U7(b),new P.vr(b))},A9:function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
 else a.au(b)},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)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
 if(!y.gcg())return
 w=z.e.gNm()
 if(w&&b==null){v=z.e.gcG()
-y=z.e.gLj()
-x=J.w8(v)
-u=v.gI4()
-y.toString
-P.CK(y,null,y,x,u)
+z.e.gLj().hk(J.w8(v),v.gI4())
 return}if(b==null)return
 if(b.gBQ()!=null){P.yE(z.e,b)
 return}x.b=!0
-t=z.e.gWj()?z.e.gDL():null
-x.c=t
+u=z.e.gWj()?z.e.gDL():null
+x.c=u
 x.d=!1
 y=!w
-if(!y||b.gO1()!=null||b.gIa()!=null){s=b.gLj()
-if(w){u=z.e.gLj()
-u.toString
-s.toString
-u=s==null?u!=null:s!==u}else u=!1
-if(u){v=z.e.gcG()
-y=z.e.gLj()
-x=J.w8(v)
-u=v.gI4()
-y.toString
-P.CK(y,null,y,x,u)
-return}r=$.X3
-if(r==null?s!=null:r!==s)$.X3=s
-else r=null
-if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,t,s).$0()}else new P.RW(z,x,b,s).$0()
-if(b.gIa()!=null)new P.RT(z,x,w,b,s).$0()
-if(r!=null)$.X3=r
+if(!y||b.gO1()!=null||b.gIa()!=null){t=b.gLj()
+if(w&&!z.e.gLj().fC(t)){v=z.e.gcG()
+z.e.gLj().hk(J.w8(v),v.gI4())
+return}s=$.X3
+if(s==null?t!=null:s!==t)$.X3=t
+else s=null
+if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
+if(b.gIa()!=null)new P.RT(z,x,w,b,t).$0()
+if(s!=null)$.X3=s
 if(x.d)return
 if(x.b===!0){y=x.c
-y=(t==null?y!=null:t!==y)&&!!J.x(y).$isb8}else y=!1
-if(y){q=x.c
-if(!!J.x(q).$isvs)if(q.Gv>=4){b.snc(!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}}}},
+b=q}}}},
 da:{
-"^":"Xs:42;a,b",
+"^":"Tp:64;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
-pV:{
-"^":"Xs:10;a",
+U7:{
+"^":"Tp:10;a",
 $1:[function(a){this.a.R8(a)},"$1",null,2,0,null,18,"call"],
 $isEH:true},
-U7:{
-"^":"Xs:77;b",
+vr:{
+"^":"Tp:93;b",
 $2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,20,21,22,"call"],
 $isEH:true},
-eX:{
-"^":"Xs:42;a,b",
+cX:{
+"^":"Tp:64;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
-pZ:{
-"^":"Xs:42;c,d",
+eX:{
+"^":"Tp:64;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 In:{
-"^":"Xs:42;a,b,c",
+"^":"Tp:64;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Xs:78;b,d,e,f",
-$0:function(){var z,y,x,w,v
-try{x=this.f
-w=this.d.gO1()
-x.toString
-this.b.c=P.V7(x,null,x,w,this.e)
-return!0}catch(v){x=H.Ru(v)
-z=x
-y=new H.oP(v,null)
+"^":"Tp:94;b,d,e,f",
+$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)
+z=w
+y=new H.XO(x,null)
 this.b.c=new P.Ca(z,y)
 return!1}},
 $isEH:true},
 RW:{
-"^":"Xs:15;c,b,UI,bK",
+"^":"Tp:15;c,b,UI,bK",
 $0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
 y=r.gyK()
 x=!0
-if(y!=null)try{q=this.bK
-p=J.w8(z)
-q.toString
-x=P.V7(q,null,q,y,p)}catch(o){r=H.Ru(o)
+if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
 w=r
-v=new H.oP(o,null)
+v=new H.XO(q,null)
 r=J.w8(z)
-q=w
-n=(r==null?q==null:r===q)?z:new P.Ca(w,v)
+p=w
+o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
 r=this.b
-r.c=n
+r.c=o
 r.b=!1
 return}u=r.go7()
 if(x===!0&&u!=null){try{r=u
-q=H.G3()
-q=H.KT(q,[q,q]).BD(r)
-p=this.bK
+p=H.G3()
+p=H.KT(p,[p,p]).BD(r)
+n=this.bK
 m=this.b
-if(q){r=J.w8(z)
-q=z.gI4()
-p.toString
-m.c=P.BD(p,null,p,u,r,q)}else{r=J.w8(z)
-p.toString
-m.c=P.V7(p,null,p,u,r)}}catch(o){r=H.Ru(o)
+if(p)m.c=n.mg(u,J.w8(z),z.gI4())
+else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
 t=r
-s=new H.oP(o,null)
+s=new H.XO(q,null)
 r=J.w8(z)
-q=t
-n=(r==null?q==null:r===q)?z:new P.Ca(t,s)
+p=t
+o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
 r=this.b
-r.c=n
+r.c=o
 r.b=!1
 return}this.b.b=!0}else{r=this.b
 r.c=z
 r.b=!1}},
 $isEH:true},
 RT:{
-"^":"Xs:15;c,b,IU,Rm,w3",
+"^":"Tp:15;c,b,Gq,Rm,w3",
 $0:function(){var z,y,x,w,v,u
 z={}
 z.a=null
-try{w=this.w3
-v=this.Rm.gIa()
-w.toString
-z.a=P.T8(w,null,w,v)}catch(u){w=H.Ru(u)
-y=w
-x=new H.oP(u,null)
-if(this.IU){w=J.w8(this.c.e.gcG())
-v=y
-v=w==null?v==null:w===v
-w=v}else w=!1
-v=this.b
-if(w)v.c=this.c.e.gcG()
-else v.c=new P.Ca(y,x)
-v.b=!1}if(!!J.x(z.a).$isb8){w=this.Rm
-w.snc(!0)
+try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+if(this.Gq){v=J.w8(this.c.e.gcG())
+u=y
+u=v==null?u==null:v===u
+v=u}else v=!1
+u=this.b
+if(v)u.c=this.c.e.gcG()
+else u.c=new P.Ca(y,x)
+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,w),new P.FZ(z,w))}},
+z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
 $isEH:true},
 jZ:{
-"^":"Xs:10;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,79,"call"],
+"^":"Tp:10;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,95,"call"],
 $isEH:true},
 FZ:{
-"^":"Xs:77;a,mG",
+"^":"Tp:93;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isvs){y=P.Dt(null)
@@ -4856,8 +4995,8 @@
 Ki:function(a){return this.FR.$0()}},
 cb:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.cb,args:[{func:"Pw",args:[a]}]}},this.$receiver,"cb")},80],
-Ft:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.cb,args:[{func:"Xy",ret:P.cX,args:[a]}]}},this.$receiver,"cb")},80],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},96],
+Ft:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.cb,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},96],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
@@ -4874,7 +5013,7 @@
 z={}
 y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gaq())
+z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gaq())
 return y},
 gB:function(a){var z,y
 z={}
@@ -4897,87 +5036,87 @@
 return y},
 $iscb:true},
 tG:{
-"^":"Xs;a,b,c,d",
+"^":"Tp;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.BE(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,81,"call"],
+P.FE(new P.BE(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,97,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 BE:{
-"^":"Xs:42;e,f",
+"^":"Tp:64;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
 Oh:{
-"^":"Xs:82;a,UI",
+"^":"Tp:98;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 kb:{
-"^":"Xs:42;bK",
+"^":"Tp:64;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
-"^":"Xs;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.at(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,81,"call"],
+"^":"Tp;a,b,c,d",
+$1:[function(a){P.FE(new P.at(this.c,a),new P.mj(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,97,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
-Rl:{
-"^":"Xs:42;e,f",
+$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
+at:{
+"^":"Tp:64;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
-at:{
-"^":"Xs:10;",
+mj:{
+"^":"Tp:10;",
 $1:function(a){},
 $isEH:true},
 ib:{
-"^":"Xs:42;UI",
+"^":"Tp:64;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ee:{
-"^":"Xs;a,b,c,d",
+Ia:{
+"^":"Tp;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,81,"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,97,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 WN:{
-"^":"Xs:42;e,f",
+"^":"Tp:64;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 XPB:{
-"^":"Xs:82;a,UI",
+"^":"Tp:98;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-Ia:{
-"^":"Xs:42;bK",
+BSd:{
+"^":"Tp:64;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uO:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:[function(a){++this.a.a},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 hh:{
-"^":"Xs:42;a,b",
+"^":"Tp:64;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 qg:{
-"^":"Xs:10;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 yB:{
-"^":"Xs:42;c",
+"^":"Tp:64;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
-"^":"Xs;a,b",
+"^":"Tp;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
 z.a=a},"$1",null,2,0,null,18,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 Z5:{
-"^":"Xs:42;a,c",
+"^":"Tp:64;a,c",
 $0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
@@ -4992,7 +5131,7 @@
 if((z.Gv&4)!==0)H.vh(P.w("Subscribing to closed stream"))
 y=$.X3
 x=a?1:0
-w=H.VM(new P.f6(null,null,null,z,null,null,null,y,x,null,null),[H.Kp(z,0)])
+w=H.VM(new P.LR(null,null,null,z,null,null,null,y,x,null,null),[H.Kp(z,0)])
 w.SJ=w
 w.iE=w
 x=z.SJ
@@ -5014,29 +5153,27 @@
 tA:function(){return this.gY8().j0(this)},
 uO:[function(){this.gY8()},"$0","gp4",0,0,15],
 LP:[function(){this.gY8()},"$0","gZ9",0,0,15]},
-oK:{
+NOT:{
 "^":"a;"},
 KA:{
-"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-yl:function(a){this.Lj.toString
-this.pN=a},
-fm:function(a,b){if(b==null)b=P.vD()
+"^":"a;pN,o7<,Bd,Lj<,Gv,lz,nb",
+yl:function(a){this.pN=this.Lj.wY(a)},
+fm:function(a,b){if(b==null)b=P.Mm()
 this.o7=P.VH(b,this.Lj)},
-y5:function(a){if(a==null)a=P.v3()
-this.Lj.toString
-this.Bd=a},
+y5:function(a){if(a==null)a=P.od()
+this.Bd=this.Lj.Al(a)},
 Fv:[function(a,b){var z,y
 z=this.Gv
 if((z&8)!==0)return
 this.Gv=(z+128|4)>>>0
 if(b!=null)b.wM(this.gDQ(this))
-if(z<128&&this.Ri!=null){y=this.Ri
-if(y.Gv===1)y.Gv=3}if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,83,20,84],
-QE:[function(a){var z=this.Gv
+if(z<128&&this.nb!=null){y=this.nb
+if(y.Gv===1)y.Gv=3}if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,99,20,100],
+zl:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.Gv=z
-if(z<128)if((z&64)!==0&&this.Ri.N6!=null)this.Ri.t2(this)
+if(z<128)if((z&64)!==0&&this.nb.N6!=null)this.nb.t2(this)
 else{z=(z&4294967291)>>>0
 this.Gv=z
 if((z&32)===0)this.J7(this.gZ9())}}},"$0","gDQ",0,0,15],
@@ -5049,40 +5186,40 @@
 tk:function(){var z,y
 z=(this.Gv|8)>>>0
 this.Gv=z
-if((z&64)!==0){y=this.Ri
-if(y.Gv===1)y.Gv=3}if((z&32)===0)this.Ri=null
+if((z&64)!==0){y=this.nb
+if(y.Gv===1)y.Gv=3}if((z&32)===0)this.nb=null
 this.lz=this.tA()},
 Rg:function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.Iv(a)
 else this.VI(H.VM(new P.fZ(a,null),[null]))},
-V8:function(a,b){var z=this.Gv
+oJ:function(a,b){var z=this.Gv
 if((z&8)!==0)return
-if(z<32)this.NA(a,b)
+if(z<32)this.pb(a,b)
 else this.VI(new P.WG(a,b,null))},
 YB:function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
 if(z<32)this.Pl()
-else this.VI(C.Wj)},
+else this.VI(C.ZB)},
 uO:[function(){},"$0","gp4",0,0,15],
 LP:[function(){},"$0","gZ9",0,0,15],
 tA:function(){},
 VI:function(a){var z,y
-z=this.Ri
+z=this.nb
 if(z==null){z=new P.qm(null,null,0)
-this.Ri=z}z.h(0,a)
+this.nb=z}z.h(0,a)
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
 this.Gv=y
-if(y<128)this.Ri.t2(this)}},
+if(y<128)this.nb.t2(this)}},
 Iv:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
-this.Lj.m1(this.pN,a)
+this.Lj.M8(this.pN,a)
 this.Gv=(this.Gv&4294967263)>>>0
 this.Kl((z&4)!==0)},
-NA:function(a,b){var z,y
+pb:function(a,b){var z,y
 z=this.Gv
 y=new P.x1(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
@@ -5099,44 +5236,41 @@
 this.Kl((z&4)!==0)},
 Kl:function(a){var z,y,x
 z=this.Gv
-if((z&64)!==0&&this.Ri.N6==null){z=(z&4294967231)>>>0
+if((z&64)!==0&&this.nb.N6==null){z=(z&4294967231)>>>0
 this.Gv=z
-if((z&4)!==0)if(z<128){y=this.Ri
+if((z&4)!==0)if(z<128){y=this.nb
 y=y==null||y.N6==null}else y=!1
 else y=!1
 if(y){z=(z&4294967291)>>>0
-this.Gv=z}}for(;!0;a=x){if((z&8)!==0){this.Ri=null
+this.Gv=z}}for(;!0;a=x){if((z&8)!==0){this.nb=null
 return}x=(z&4)!==0
 if(a===x)break
 this.Gv=(z^32)>>>0
 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)},
+this.Gv=z}if((z&64)!==0&&z<128)this.nb.t2(this)},
 $isMO:true,
-static:{"^":"Xx,bG,nS,Ir,yJ,Dr,JAK,GC,Pj"}},
+static:{"^":"Xx,bG,nS,Ir,nav,Dr,JAK,N3S,bsZ"}},
 x1:{
-"^":"Xs:15;a,b,c",
+"^":"Tp:15;a,b,c",
 $0:function(){var z,y,x,w,v,u
 z=this.a
 y=z.Gv
 if((y&8)!==0&&(y&16)===0)return
 z.Gv=(y|32)>>>0
 y=z.Lj
-x=$.X3
-y.toString
-x.toString
-if(x==null?y!=null:x!==y)P.CK(x,null,x,this.b,this.c)
+if(!y.fC($.X3))$.X3.hk(this.b,this.c)
 else{x=z.o7
 w=H.G3()
 w=H.KT(w,[w,w]).BD(x)
 v=z.o7
 u=this.b
 if(w)y.z8(v,u,this.c)
-else y.m1(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
+else y.M8(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
 qQ:{
-"^":"Xs:15;a",
+"^":"Tp:15;a",
 $0:function(){var z,y
 z=this.a
 y=z.Gv
@@ -5167,21 +5301,21 @@
 dP:function(a){a.Iv(this.P)}},
 WG:{
 "^":"fIm;kc>,I4<,aw",
-dP:function(a){a.NA(this.kc,this.I4)}},
+dP:function(a){a.pb(this.kc,this.I4)}},
 JF:{
 "^":"a;",
 dP:function(a){a.Pl()},
 gaw:function(){return},
 saw:function(a){throw H.b(P.w("No events after a done."))}},
-ht:{
+r5:{
 "^":"a;",
 t2:function(a){var z=this.Gv
 if(z===1)return
 if(z>=1){this.Gv=1
-return}P.rb(new P.CR(this,a))
+return}P.rb(new P.Vd(this,a))
 this.Gv=1}},
-CR:{
-"^":"Xs:42;a,b",
+Vd:{
+"^":"Tp:64;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -5190,7 +5324,7 @@
 z.TO(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 qm:{
-"^":"ht;zR,N6,Gv",
+"^":"r5;zR,N6,Gv",
 gl0:function(a){return this.N6==null},
 h:function(a,b){var z=this.N6
 if(z==null){this.N6=b
@@ -5206,15 +5340,15 @@
 this.N6=null
 this.zR=null}},
 dR:{
-"^":"Xs:42;a,b,c",
+"^":"Tp:64;a,b,c",
 $0:function(){return this.a.K5(this.b,this.c)},
 $isEH:true},
 uR:{
-"^":"Xs:85;a,b",
+"^":"Tp:101;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 Q0:{
-"^":"Xs:42;a,b",
+"^":"Tp:64;a,b",
 $0:function(){return this.a.rX(this.b)},
 $isEH:true},
 og:{
@@ -5226,7 +5360,7 @@
 x=$.X3
 w=b?1:0
 v=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
-v.S8(this,b,z,y)
+v.Ri(this,b,z,y)
 v.yl(a)
 v.fm(0,d)
 v.y5(c)
@@ -5236,27 +5370,27 @@
 ut:function(a,b){b.Rg(a)},
 $ascb:function(a,b){return[b]}},
 fB:{
-"^":"KA;UY,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
+"^":"KA;UY,WS,pN,o7,Bd,Lj,Gv,lz,nb",
 Rg:function(a){if((this.Gv&2)!==0)return
 P.KA.prototype.Rg.call(this,a)},
-V8:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.V8.call(this,a,b)},
-uO:[function(){var z=this.Ee
+oJ:function(a,b){if((this.Gv&2)!==0)return
+P.KA.prototype.oJ.call(this,a,b)},
+uO:[function(){var z=this.WS
 if(z==null)return
 z.yy(0)},"$0","gp4",0,0,15],
-LP:[function(){var z=this.Ee
+LP:[function(){var z=this.WS
 if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,15],
-tA:function(){var z=this.Ee
-if(z!=null){this.Ee=null
+z.zl(0)},"$0","gZ9",0,0,15],
+tA:function(){var z=this.WS
+if(z!=null){this.WS=null
 z.ed()}return},
-vx:[function(a){this.UY.ut(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"wa",void:true,args:[a]}},this.$receiver,"fB")},74],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,86,21,22],
+vx:[function(a){this.UY.ut(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"wa",void:true,args:[a]}},this.$receiver,"fB")},90],
+xL:[function(a,b){this.oJ(a,b)},"$2","gRE",4,0,102,21,22],
 fE:[function(){this.YB()},"$0","gH1",0,0,15],
-S8:function(a,b,c,d){var z,y
+Ri:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
-this.Ee=this.UY.Sb.zC(z,this.gH1(),y)},
+this.WS=this.UY.Sb.zC(z,this.gH1(),y)},
 $asKA:function(a,b){return[b]},
 $asMO:function(a,b){return[b]}},
 nO:{
@@ -5266,8 +5400,8 @@
 z=null
 try{z=this.wW(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-b.V8(y,x)
+x=new H.XO(w,null)
+b.oJ(y,x)
 return}if(z===!0)b.Rg(a)},
 $asog:function(a){return[a,a]},
 $ascb:null},
@@ -5278,8 +5412,8 @@
 z=null
 try{z=this.kn(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-b.V8(y,x)
+x=new H.XO(w,null)
+b.oJ(y,x)
 return}b.Rg(z)}},
 Bg:{
 "^":"og;pK,Sb",
@@ -5288,57 +5422,142 @@
 try{for(w=J.mY(this.GW(a));w.G();){z=w.gl()
 b.Rg(z)}}catch(v){w=H.Ru(v)
 y=w
-x=new H.oP(v,null)
-b.V8(y,x)}}},
+x=new H.XO(v,null)
+b.oJ(y,x)}}},
+Xa:{
+"^":"a;"},
+aY:{
+"^":"a;"},
+yQ:{
+"^":"a;E2<,cP<,Ot<,eo<,Ka<,Xp<,fb<,rb<,Zq<,NW,mp>,il<",
+hk:function(a,b){return this.E2.$2(a,b)},
+Gr:function(a){return this.cP.$1(a)},
+FI:function(a,b){return this.Ot.$2(a,b)},
+mg:function(a,b,c){return this.eo.$3(a,b,c)},
+Al:function(a){return this.Ka.$1(a)},
+wY:function(a){return this.Xp.$1(a)},
+O8:function(a){return this.fb.$1(a)},
+wr:function(a){return this.rb.$1(a)},
+RK:function(a,b){return this.rb.$2(a,b)},
+uN:function(a,b){return this.Zq.$2(a,b)},
+Ch:function(a,b){return this.mp.$1(b)},
+qp:function(a){return this.il.$1$specification(a)}},
+qK:{
+"^":"a;"},
+xp:{
+"^":"a;"},
+Id:{
+"^":"a;nU",
+gLj:function(){return this.nU},
+x5:function(a,b,c){var z=this.nU
+for(;z.gtp().gE2()==null;)z=z.geT(z)
+return z.gtp().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
+Vn:function(a,b){var z=this.nU
+for(;z.gtp().gcP()==null;)z=z.geT(z)
+return z.gtp().gcP().$4(z,new P.Id(z.geT(z)),a,b)},
+qG:function(a,b,c){var z=this.nU
+for(;z.gtp().gOt()==null;)z=z.geT(z)
+return z.gtp().gOt().$5(z,new P.Id(z.geT(z)),a,b,c)},
+nA:function(a,b,c,d){var z=this.nU
+for(;z.gtp().geo()==null;)z=z.geT(z)
+return z.gtp().geo().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
+TE:function(a,b){var z=this.nU
+for(;z.gtp().gKa()==null;)z=z.geT(z)
+return z.gtp().gKa().$4(z,new P.Id(z.geT(z)),a,b)},
+xO:function(a,b){var z=this.nU
+for(;z.gtp().gXp()==null;)z=z.geT(z)
+return z.gtp().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
+mz:function(a,b){var z=this.nU
+for(;z.gtp().gfb()==null;)z=z.geT(z)
+return z.gtp().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
+RK:function(a,b){var z,y
+z=this.nU
+for(;z.gtp().grb()==null;)z=z.geT(z)
+y=z.geT(z)
+z.gtp().grb().$4(z,new P.Id(y),a,b)},
+dJ:function(a,b,c){var z=this.nU
+for(;z.gtp().gZq()==null;)z=z.geT(z)
+return z.gtp().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
+RB:function(a,b,c){var z,y
+z=this.nU
+for(;y=z.gtp(),y.gmp(y)==null;)z=z.geT(z)
+y=z.gtp()
+y.gmp(y).$4(z,new P.Id(z.geT(z)),b,c)},
+ld:function(a,b,c){var z,y
+z=this.nU
+for(;z.gtp().gil()==null;)z=z.geT(z)
+y=z.geT(z)
+return z.gtp().gil().$5(z,new P.Id(y),a,b,c)}},
 ld:{
 "^":"a;",
+fC:function(a){return this.gC5()===a.gC5()},
 bH:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
-m1:function(a,b){var z,y,x,w
+M8:function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
 z8:function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
 xi:function(a,b){var z=this.Al(a)
 if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},
+else return new P.Xz(this,z)},
 ce:function(a){return this.xi(a,!0)},
 Nf:function(a,b){var z=this.wY(a)
 if(b)return new P.Cg(this,z)
 else return new P.Hs(this,z)}},
 TF:{
-"^":"Xs:42;a,b",
+"^":"Tp:64;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
-K5:{
-"^":"Xs:42;c,d",
+Xz:{
+"^":"Tp:64;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Xs:10;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,87,"call"],
+"^":"Tp:10;a,b",
+$1:[function(a){return this.a.M8(this.b,a)},"$1",null,2,0,null,30,"call"],
 $isEH:true},
 Hs:{
-"^":"Xs:10;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,87,"call"],
+"^":"Tp:10;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,30,"call"],
 $isEH:true},
+uo:{
+"^":"ld;eT>,tp<,Se",
+gC5:function(){return this.eT.gC5()},
+t:function(a,b){var z,y
+z=this.Se
+y=z.t(0,b)
+if(y!=null||z.x4(b))return y
+return this.eT.t(0,b)},
+hk:function(a,b){return new P.Id(this).x5(this,a,b)},
+uI:function(a,b){return new P.Id(this).ld(this,a,b)},
+qp:function(a){return this.uI(a,null)},
+Gr:function(a){return new P.Id(this).Vn(this,a)},
+FI:function(a,b){return new P.Id(this).qG(this,a,b)},
+mg:function(a,b,c){return new P.Id(this).nA(this,a,b,c)},
+Al:function(a){return new P.Id(this).TE(this,a)},
+wY:function(a){return new P.Id(this).xO(this,a)},
+O8:function(a){return new P.Id(this).mz(this,a)},
+wr:function(a){new P.Id(this).RK(this,a)},
+uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
+Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
 FO:{
-"^":"Xs:42;a,b",
-$0:function(){P.IA(new P.eM(this.a,this.b))},
+"^":"Tp:64;a,b",
+$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Xs:42;c,d",
+"^":"Tp:64;c,d",
 $0:[function(){var z,y
 z=this.c
 P.FL("Uncaught Error: "+H.d(z))
@@ -5347,21 +5566,60 @@
 if(y!=null)P.FL("Stack Trace: \n"+H.d(y)+"\n")
 throw H.b(z)},"$0",null,0,0,null,"call"],
 $isEH:true},
+Uez:{
+"^":"Tp:67;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,68,18,"call"],
+$isEH:true},
+AH:{
+"^":"a;",
+gE2:function(){return P.wL()},
+hk:function(a,b){return this.gE2().$2(a,b)},
+gcP:function(){return P.lw()},
+Gr:function(a){return this.gcP().$1(a)},
+gOt:function(){return P.MM()},
+FI:function(a,b){return this.gOt().$2(a,b)},
+geo:function(){return P.iy()},
+mg:function(a,b,c){return this.geo().$3(a,b,c)},
+gKa:function(){return P.Qk()},
+Al:function(a){return this.gKa().$1(a)},
+gXp:function(){return P.zi()},
+wY:function(a){return this.gXp().$1(a)},
+gfb:function(){return P.v3()},
+O8:function(a){return this.gfb().$1(a)},
+grb:function(){return P.G2()},
+wr:function(a){return this.grb().$1(a)},
+RK:function(a,b){return this.grb().$2(a,b)},
+gZq:function(){return P.KF()},
+uN:function(a,b){return this.gZq().$2(a,b)},
+gmp:function(a){return P.aW()},
+Ch:function(a,b){return this.gmp(this).$1(b)},
+gil:function(){return P.Is()},
+qp:function(a){return this.gil().$1$specification(a)}},
 R81:{
 "^":"ld;",
 geT:function(a){return},
+gtp:function(){return C.v8},
+gC5:function(){return this},
+fC:function(a){return a.gC5()===this},
 t:function(a,b){return},
 hk:function(a,b){return P.CK(this,null,this,a,b)},
+uI:function(a,b){return P.UA(this,null,this,a,b)},
+qp:function(a){return this.uI(a,null)},
 Gr:function(a){return P.T8(this,null,this,a)},
 FI:function(a,b){return P.V7(this,null,this,a,b)},
-mg:function(a,b,c){return P.BD(this,null,this,a,b,c)},
+mg:function(a,b,c){return P.Mu(this,null,this,a,b,c)},
 Al:function(a){return a},
-wY:function(a){return a}}}],["dart.collection","dart:collection",,P,{
+wY:function(a){return a},
+O8:function(a){return a},
+wr:function(a){P.Tk(this,null,this,a)},
+uN:function(a,b){return P.h8(this,null,this,a,b)},
+Ch:function(a,b){H.qw(b)
+return}}}],["dart.collection","dart:collection",,P,{
 "^":"",
 EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-Ou:[function(a,b){return J.xC(a,b)},"$2","bd",4,0,23,24,25],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,26,24],
+R2:[function(a,b){return J.xC(a,b)},"$2","lZ",4,0,42,43,44],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,45,43],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -5370,15 +5628,21 @@
 RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
 op:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
 yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
-m4:function(a,b,c){var z,y
-if($.xb().tg(0,a))return b+"..."+c
-$.xb().h(0,a)
-z=[]
-try{P.eG(a,z)}finally{$.xb().Rz(0,a)}y=P.p9(b)
+Ix:function(a,b,c){var z,y
+if($.Ex().tg(0,a)){if(b==="("&&c===")")return"(...)"
+return b+"..."+c}z=[]
+$.Ex().h(0,a)
+try{P.T4(a,z)}finally{$.Ex().Rz(0,a)}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
 return y.vM},
-eG:function(a,b){var z,y,x,w,v,u,t,s,r,q
+WE:function(a,b,c){var z
+if($.Ex().tg(0,a))return b+"..."+c
+z=P.p9(b)
+$.Ex().h(0,a)
+try{z.We(a,", ")}finally{$.Ex().Rz(0,a)}z.KF(c)
+return z.gvM()},
+T4:function(a,b){var z,y,x,w,v,u,t,s,r,q
 z=a.gA(a)
 y=0
 x=0
@@ -5530,11 +5794,11 @@
 delete z["<non-identifier-key>"]
 return z}}},
 oi:{
-"^":"Xs:10;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,88,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,103,"call"],
 $isEH:true},
 DJ:{
-"^":"Xs;a",
+"^":"Tp;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
@@ -5568,7 +5832,7 @@
 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:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -5717,11 +5981,11 @@
 delete z["<non-identifier-key>"]
 return z}}},
 a1:{
-"^":"Xs:10;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,88,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,103,"call"],
 $isEH:true},
 pk:{
-"^":"Xs;a",
+"^":"Tp;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
@@ -5757,7 +6021,7 @@
 this.zq=this.zq.gDG()
 return!0}}}},
 jg:{
-"^":"u3T;X5,vv,OX,OB,DM",
+"^":"lN;X5,vv,OX,OB,DM",
 gA:function(a){var z=new P.oz(this,this.Zl(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
@@ -5857,8 +6121,8 @@
 for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{jB:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
@@ -5884,7 +6148,7 @@
 this.zi=y+1
 return!0}}},
 D0:{
-"^":"u3T;X5,vv,OX,OB,H9,lX,zN",
+"^":"lN;X5,vv,OX,OB,H9,lX,zN",
 gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
@@ -5993,8 +6257,8 @@
 for(y=0;y<z;++y)if(J.xC(a[y].gGc(),b))return y
 return-1},
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{T2:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
@@ -6012,19 +6276,18 @@
 this.zq=this.zq.gDG()
 return!0}}}},
 Yp:{
-"^":"XC;G4",
+"^":"w2Y;G4",
 gB:function(a){return this.G4.length},
 t:function(a,b){var z=this.G4
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]}},
-u3T:{
-"^":"Yw;",
-bu:function(a){return P.m4(this,"{","}")}},
+lN:{
+"^":"Vj;"},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"Uy",ret:P.cX,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},48],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"Uy",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},28],
 ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.cX,args:[{func:"tr",ret:P.cX,args:[a]}]}},this.$receiver,"mW")},48],
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},28],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -6063,16 +6326,18 @@
 w=J.x(y)
 if(w.n(y,0))return x
 y=w.W(y,1)}throw H.b(P.N(b))},
-bu:function(a){return P.m4(this,"(",")")},
-$iscX:true,
-$ascX:null},
+bu:function(a){return P.Ix(this,"(",")")},
+$isQV:true,
+$asQV:null},
 rm:{
+"^":"eD;"},
+eD:{
 "^":"a+lD;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
@@ -6099,8 +6364,8 @@
 z.We(a,b)
 return z.vM},
 ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"uY",ret:P.cX,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},48],
-Ft:[function(a,b){return H.VM(new H.zs(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.cX,args:[{func:"VL",ret:P.cX,args:[a]}]}},this.$receiver,"lD")},48],
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},28],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},28],
 eR:function(a,b){return H.j5(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -6157,7 +6422,7 @@
 for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
 return-1},
 cn:function(a,b){return this.Pk(a,b,null)},
-aP:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
+xe:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,this.gB(a)+1)
 this.YW(a,b+1,this.gB(a),a,b)
@@ -6169,26 +6434,20 @@
 y=J.q8(c)
 this.sB(a,this.gB(a)+y)
 this.YW(a,b+y,this.gB(a),a,b)
-this.Mh(a,b,c)},
-Mh:function(a,b,c){var z,y
+this.Yj(a,b,c)},
+Yj:function(a,b,c){var z,y
 z=J.x(c)
 if(!!z.$isWO)this.vg(a,b,b+z.gB(c),c)
 else for(z=z.gA(c);z.G();b=y){y=b+1
 this.u(a,b,z.gl())}},
-bu:function(a){var z
-if($.xb().tg(0,a))return"[...]"
-z=P.p9("")
-try{$.xb().h(0,a)
-z.KF("[")
-z.We(a,", ")
-z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
+bu:function(a){return P.WE(a,"[","]")},
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 W0:{
-"^":"Xs:51;a,b",
+"^":"Tp:67;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
@@ -6213,7 +6472,7 @@
 grZ:function(a){var z,y,x
 z=this.av
 y=this.eZ
-if(z===y)throw H.b(P.w("No elements"))
+if(z===y)throw H.b(H.DU())
 z=this.v5
 x=z.length
 y=(y-1&x-1)>>>0
@@ -6256,10 +6515,10 @@
 if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
 x[z]=null}this.eZ=0
 this.av=0;++this.qT}},
-bu:function(a){return P.m4(this,"{","}")},
+bu:function(a){return P.WE(this,"{","}")},
 AR:function(){var z,y,x,w
 z=this.av
-if(z===this.eZ)throw H.b(P.w("No elements"));++this.qT
+if(z===this.eZ)throw H.b(H.DU());++this.qT
 y=this.v5
 x=y.length
 if(z>=x)return H.e(y,z)
@@ -6306,8 +6565,8 @@
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{"^":"TN",Pd:function(a){var z
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
@@ -6327,7 +6586,7 @@
 this.fD=z[y]
 this.Dc=(y+1&x-1)>>>0
 return!0}},
-lf:{
+lfu:{
 "^":"a;",
 gl0:function(a){return this.gB(this)===0},
 gor:function(a){return this.gB(this)!==0},
@@ -6337,18 +6596,20 @@
 Ex:function(a){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)this.Rz(0,z.lo)},
 tt:function(a,b){var z,y,x,w,v
-if(b){z=H.VM([],[H.ip(this,"lf",0)])
+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.ip(this,"lf",0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
+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},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.ip(this,"lf",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQO",ret:P.cX,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lf")},48],
-bu:function(a){return P.m4(this,"{","}")},
-ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"lf",0)])},
-Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"lf",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.cX,args:[{func:"D6",ret:P.cX,args:[a]}]}},this.$receiver,"lf")},48],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Kp(this,0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lfu")},28],
+bu:function(a){return P.WE(this,"{","}")},
+ev:function(a,b){var z=new H.U5(this,b)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z},
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.Kp(this,0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"D6",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},28],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
@@ -6371,20 +6632,17 @@
 while(z.G())
 return y},
 $isyN:true,
-$iscX:true,
-$ascX:null},
-Yw:{
-"^":"a+lf;",
-$isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
+Vj:{
+"^":"lfu;"},
 qv:{
 "^":"a;G3>,Bb>,T8>",
 $isqv:true},
 jp:{
 "^":"qv;P*,G3,Bb,T8",
 $asqv:function(a,b){return[a]}},
-Xt:{
+vX1:{
 "^":"a;",
 vh:function(a){var z,y,x,w,v,u,t,s
 z=this.aY
@@ -6430,7 +6688,7 @@
 a.Bb=y.Bb
 y.Bb=null}this.aY=a}},
 Ba:{
-"^":"Xt;Cw,hg,aY,iW,J0,qT,bb",
+"^":"vX1;Cw,hg,aY,iW,J0,qT,bb",
 wS:function(a,b){return this.Cw.$2(a,b)},
 Ef:function(a){return this.hg.$1(a)},
 yV:function(a,b){return this.wS(a,b)},
@@ -6462,7 +6720,7 @@
 return z},
 bu:function(a){return P.vW(this)},
 $isBa:true,
-$asXt:function(a,b){return[a]},
+$asvX1:function(a,b){return[a]},
 $asZ0:null,
 $isZ0:true,
 static:{GV:function(a,b,c,d){var z,y
@@ -6470,12 +6728,12 @@
 y=new P.An(c)
 return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
 QG:{
-"^":"Xs;a",
+"^":"Tp;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
@@ -6524,7 +6782,7 @@
 y.Qf(z,H.Kp(this,1))
 return y},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
 "^":"S6B;lT,Jt,qT,bb,ya",
@@ -6538,7 +6796,7 @@
 Wb:function(a){return a},
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
-Uw:function(a,b){var z=b==null?new P.JC():b
+Uw:function(a,b){var z=b==null?new P.hW():b
 return z.$2(null,new P.f1(z).$1(a))},
 jc:function(a,b){var z,y,x,w
 x=a
@@ -6547,13 +6805,13 @@
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
 throw H.b(P.cD(String(y)))}return P.Uw(z,b)},
-tp:[function(a){return a.Bu()},"$1","Mn",2,0,27,28],
-JC:{
-"^":"Xs:51;",
+NC:[function(a){return a.Lt()},"$1","bx",2,0,46,47],
+hW:{
+"^":"Tp:67;",
 $2:function(a,b){return b},
 $isEH:true},
 f1:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
@@ -6585,9 +6843,9 @@
 "^":"Wf;qa<,fO",
 pW:function(a,b){return P.jc(a,this.gHe().qa)},
 kV:function(a){return this.pW(a,null)},
-Q0:function(a,b){var z=this.gZE()
+Co:function(a,b){var z=this.gZE()
 return P.Vg(a,z.Xn,z.UM)},
-KP:function(a){return this.Q0(a,null)},
+KP:function(a){return this.Co(a,null)},
 gZE:function(){return C.Sr},
 gHe:function(){return C.A3},
 $asWf:function(){return[P.a,P.qU]}},
@@ -6598,13 +6856,13 @@
 "^":"zF;qa<",
 $aszF:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;fO,cP,ol",
+"^":"a;fO,p8,ol",
 iY:function(a){return this.fO.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
 if(typeof y!=="number")return H.s(y)
-x=this.cP
+x=this.p8
 w=0
 v=0
 for(;v<y;++v){u=z.j(a,v)
@@ -6662,24 +6920,24 @@
 throw H.b(P.Gy(a,y))}}},
 IS:function(a){var z,y,x,w,v,u
 if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.cP.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.cP.KF("true")
-return!0}else if(a===!1){this.cP.KF("false")
-return!0}else if(a==null){this.cP.KF("null")
-return!0}else if(typeof a==="string"){z=this.cP
+this.p8.KF(C.CD.bu(a))
+return!0}else if(a===!0){this.p8.KF("true")
+return!0}else if(a===!1){this.p8.KF("false")
+return!0}else if(a==null){this.p8.KF("null")
+return!0}else if(typeof a==="string"){z=this.p8
 z.KF("\"")
 this.Ip(a)
 z.KF("\"")
 return!0}else{z=J.x(a)
 if(!!z.$isWO){this.WD(a)
-y=this.cP
+y=this.p8
 y.KF("[")
 if(z.gB(a)>0){this.C7(z.t(a,0))
 for(x=1;x<z.gB(a);++x){y.vM+=","
 this.C7(z.t(a,x))}}y.KF("]")
 this.pg(a)
 return!0}else if(!!z.$isZ0){this.WD(a)
-y=this.cP
+y=this.p8
 y.KF("{")
 for(w=J.mY(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
 y.vM+=v
@@ -6691,13 +6949,13 @@
 pg:function(a){var z=this.ol
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"P3,hyY,IE,Jyf,NoV,fg,Wk,WF,E7,Ho,vk,NXu,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
-b=P.Mn()
+static:{"^":"P3,hyY,IE,Jyf,NoV,fg,Wk,pe,E7,MU,vk,NXu,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+b=P.bx()
 z=P.p9("")
 P.uI(z,b,c).C7(a)
 return z.vM}}},
-Fd:{
-"^":"Ziv;IE",
+u5F:{
+"^":"Ziv;Iy",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
@@ -6779,10 +7037,10 @@
 this.L8=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
-static:{"^":"Jf"}}}],["dart.core","dart:core",,P,{
+static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
 "^":"",
 Te:function(a){return},
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,29,24,25],
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,48,43,44],
 hl:function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -6802,16 +7060,19 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,30],
-QP:[function(a){return H.CU(a)},"$1","V4",2,0,31],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,49],
+QP:[function(a){return H.CU(a)},"$1","V4",2,0,50],
 F:function(a,b,c){var z,y
 z=H.VM([],[c])
 for(y=J.mY(a);y.G();)z.push(y.gl())
 if(b)return z
 z.fixed$length=init
 return z},
-FL:function(a){var z=H.d(a)
-H.qw(z)},
+FL:function(a){var z,y
+z=H.d(a)
+y=$.oK
+if(y==null)H.qw(z)
+else y.$1(z)},
 jW:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
@@ -6826,12 +7087,12 @@
 y.vM+=u}else{u=H.Lw(37)
 y.vM+=u
 z.$2(v,y)}}return y.vM},
-qa:{
-"^":"Xs:51;a",
+Y25:{
+"^":"Tp:67;a",
 $2:function(a,b){this.a.u(0,a.gfN(),b)},
 $isEH:true},
 CL:{
-"^":"Xs:89;a",
+"^":"Tp:104;a",
 $2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(a.gfN())
@@ -6845,28 +7106,28 @@
 Rz:{
 "^":"a;"},
 iP:{
-"^":"a;y3<,SF",
+"^":"a;y3<,aL",
 n:function(a,b){if(b==null)return!1
 if(!J.x(b).$isiP)return!1
-return this.y3===b.y3&&this.SF===b.SF},
+return this.y3===b.y3&&this.aL===b.aL},
 iM:function(a,b){return C.CD.iM(this.y3,b.gy3())},
 giO:function(a){return this.y3},
 bu:function(a){var z,y,x,w,v,u,t,s
-z=this.SF
-y=P.Gq(z?H.U8(this).getUTCFullYear()+0:H.U8(this).getFullYear()+0)
-x=P.h0(z?H.U8(this).getUTCMonth()+1:H.U8(this).getMonth()+1)
-w=P.h0(z?H.U8(this).getUTCDate()+0:H.U8(this).getDate()+0)
-v=P.h0(z?H.U8(this).getUTCHours()+0:H.U8(this).getHours()+0)
-u=P.h0(z?H.U8(this).getUTCMinutes()+0:H.U8(this).getMinutes()+0)
-t=P.h0(z?H.U8(this).getUTCSeconds()+0:H.U8(this).getSeconds()+0)
-s=P.Vx(z?H.U8(this).getUTCMilliseconds()+0:H.U8(this).getMilliseconds()+0)
+z=this.aL
+y=P.Gq(z?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0)
+x=P.h0(z?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
+w=P.h0(z?H.o2(this).getUTCDate()+0:H.o2(this).getDate()+0)
+v=P.h0(z?H.o2(this).getUTCHours()+0:H.o2(this).getHours()+0)
+u=P.h0(z?H.o2(this).getUTCMinutes()+0:H.o2(this).getMinutes()+0)
+t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
+s=P.pV(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
 else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},
-h:function(a,b){return P.Wu(this.y3+b.gVs(),this.SF)},
-EK:function(){H.U8(this)},
+h:function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},
+EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"aV,Vp,Eu,Kw,h2,mo,EQe,Qg,H9,Gio,Fz,LC,E03,KeL,Ne,NrX,Dk,o4I,hZ,ek0,TO,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"bS,Vp8,Eu,Kw,h2,mo,EQe,Qg,tp1,Xs,Fz,LC,E03,KeL,Ne,NrX,Dk,o4I,hZ,PW,TO,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.ol("^([+-]?\\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
@@ -6908,17 +7169,17 @@
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},Vx:function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},pV:function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 MF:{
-"^":"Xs:90;",
+"^":"Tp:105;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Xs:91;",
+"^":"Tp:106;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -6954,9 +7215,9 @@
 v=new P.P7().$1(C.CD.JV(y,1000000))
 return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"YN,v7,dko,LoB,RD,b2H,q9,ll,DoM,CvD,MV,IJZ,iI,Wr,Nw,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"YN,v7,dko,LoB,RD,b2H,q9,ll,DoM,CvD,MV,IJZ,D9,Wr,Nw,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Xs:12;",
+"^":"Tp:12;",
 $1:function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
@@ -6965,13 +7226,13 @@
 return"00000"+H.d(a)},
 $isEH:true},
 wr:{
-"^":"Xs:12;",
+"^":"Tp:12;",
 $1:function(a){if(a>=10)return H.d(a)
 return"0"+H.d(a)},
 $isEH:true},
 XS:{
 "^":"a;",
-gI4:function(){return new H.oP(this.$thrownJsError,null)},
+gI4:function(){return new H.XO(this.$thrownJsError,null)},
 $isXS:true},
 LK:{
 "^":"XS;",
@@ -6985,11 +7246,11 @@
 Sn:{
 "^":"AT;G1",
 bu:function(a){return"RangeError: "+H.d(this.G1)},
-static:{C3:function(a){return new P.Sn(a)},N:function(a){return new P.Sn("value "+H.d(a))},TE:function(a,b,c){return new P.Sn("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
+static:{KP:function(a){return new P.Sn(a)},N:function(a){return new P.Sn("value "+H.d(a))},TE:function(a,b,c){return new P.Sn("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
 Np:{
 "^":"XS;",
 static:{a9:function(){return new P.Np()}}},
-mp:{
+JS:{
 "^":"XS;uF,UP,mP,SA,vG",
 bu:function(a){var z,y,x,w,v,u
 z={}
@@ -7001,18 +7262,18 @@
 u=P.hl(y[x])
 v.vM+=typeof u==="string"?u:H.d(u)}this.SA.aN(0,new P.CL(z))
 return"NoSuchMethodError : method not found: '"+this.UP.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},
-$ismp:true,
-static:{lr:function(a,b,c,d,e){return new P.mp(a,b,c,d,e)}}},
+$isJS:true,
+static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
 "^":"XS;G1>",
 bu:function(a){return"Unsupported operation: "+this.G1},
 static:{f:function(a){return new P.ub(a)}}},
-ds:{
+rM:{
 "^":"XS;G1>",
 bu:function(a){var z=this.G1
 return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},
 $isXS:true,
-static:{SY:function(a){return new P.ds(a)}}},
+static:{SY:function(a){return new P.rM(a)}}},
 lj:{
 "^":"XS;G1>",
 bu:function(a){return"Bad state: "+this.G1},
@@ -7023,7 +7284,7 @@
 if(z==null)return"Concurrent modification during iteration."
 return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},
 static:{a4:function(a){return new P.UV(a)}}},
-vG:{
+qn:{
 "^":"a;",
 bu:function(a){return"Out of Memory"},
 gI4:function(){return},
@@ -7054,16 +7315,16 @@
 "^":"a;oc>",
 bu:function(a){return"Expando:"+H.d(this.oc)},
 t:function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.J4())},
+return z==null?null:H.of(z,this.Qz())},
 u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.Ch(b,"expando$values",z)}H.Ch(z,this.J4(),c)},
-J4:function(){var z,y
+H.R0(b,"expando$values",z)}H.R0(z,this.Qz(),c)},
+Qz:function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
 $.Ss=y+1
 z="expando$key$"+y
-H.Ch(this,"expando$key",z)}return z},
+H.R0(this,"expando$key",z)}return z},
 static:{"^":"bZT,rly,Ss"}},
 EH:{
 "^":"a;",
@@ -7072,19 +7333,19 @@
 "^":"FK;",
 $isKN:true},
 "+int":0,
-cX:{
+QV:{
 "^":"a;",
-$iscX:true,
-$ascX:null},
-AC:{
+$isQV:true,
+$asQV:null},
+Yl:{
 "^":"a;"},
 WO:{
 "^":"a;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 "+List":0,
 Z0:{
 "^":"a;",
@@ -7102,23 +7363,23 @@
 n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
 bu:function(a){return H.a5(this)},
-T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gZ2(),null))},
+T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
 "^":"a;",
 $isOd:true},
-MN:{
+mE:{
 "^":"a;"},
 qU:{
 "^":"a;",
 $isqU:true},
 "+String":0,
 WU:{
-"^":"a;Cb,R7,C3,Wn",
+"^":"a;Cb,R7,Oq,Wn",
 gl:function(){return this.Wn},
 G:function(){var z,y,x,w,v,u
-z=this.C3
+z=this.Oq
 this.R7=z
 y=this.Cb
 x=y.length
@@ -7126,9 +7387,9 @@
 return!1}w=C.xB.j(y,z)
 v=this.R7+1
 if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
-if((u&64512)===56320){this.C3=v+1
+if((u&64512)===56320){this.Oq=v+1
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.C3=v
+return!0}}this.Oq=v
 this.Wn=w
 return!0}},
 Rn:{
@@ -7160,23 +7421,23 @@
 "^":"a;",
 $isuq:true},
 rI:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 r3:function(a,b){return document.createElement(a)},
-It:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+It:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.KxY())},
 lt:function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.fJ
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
-C.W3.eo(x,"GET",a,!0)
+C.W3.kP(x,"GET",a,!0)
 z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
 H.VM(new W.fd(0,z.bi,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
 z=H.VM(new W.RO(x,C.MD.Ph,!1),[null])
-H.VM(new W.fd(0,z.bi,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(y.gXN()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
 return y.MM},
 ED:function(a){var z,y
@@ -7195,31 +7456,30 @@
 ju:function(a){return a},
 Z9:function(a){if(!!J.x(a).$isQF)return a
 return P.o7(a,!0)},
-v8:function(a,b){return new W.vZ(a,b)},
-w6:[function(a){return J.N1(a)},"$1","B4",2,0,10,32],
-Hx:[function(a){return J.vr(a)},"$1","Z6",2,0,10,32],
-Qp:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","A6",8,0,33,32,34,35,36],
-aF:function(a){var z=$.X3
-if(z===C.NU)return a
+Xw:function(a,b){return new W.uY(a,b)},
+w6:[function(a){return J.N1(a)},"$1","B4",2,0,10,51],
+Hx:[function(a){return J.UC(a)},"$1","Z6",2,0,10,51],
+Qp:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","A6",8,0,52,51,53,54,55],
+aF:function(a){if(J.xC($.X3,C.NU))return a
 if(a==null)return
-return z.Nf(a,!0)},
+return $.X3.Nf(a,!0)},
 Bo:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|qo|ir|LP|hV|uL|Vf|G6|pv|xI|eW|Vfx|aC|VY|Dsd|Be|tuj|i6|Nr|JI|Vct|ZP|D13|nJ|LPc|Eg|i7|WZq|Gk|Zz|DK|pva|BS|cda|Vb|waa|Ly|pR|V5|hx|V8|L4|V10|mO|DE|V11|U1|V12|kK|oa|V13|St|V14|IW|V15|Qh|V16|Oz|V17|Mc|V18|qk|V19|vj|LU|V20|CX|V21|md|V22|Bm|V23|Ya|V24|Ww|V25|G1|V26|fl|V27|UK|V28|wM|V29|F1|V30|qZ|V31|Uy|T53|kn|V32|fI|V33|zM|V34|Rk|V35|Ti|Xfs|CY|V36|nm|V37|uw|I5|V38|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|ir|LPc|hV|uL|Vf|G6|pv|xI|eW|Vfx|aC|VY|Dsd|Be|tuj|i6|Xfs|JI|Vct|ZP|D13|nJ|SaM|Eg|i7|WZq|Gk|pva|Nr|cda|MJ|T53|DK|waa|BS|V3|Vb|V5|Ly|pR|V8|hx|V10|L4|Mb|V11|mO|DE|V12|U1|qh|V13|oF|V14|Q6|uE|V15|Zn|V16|n5|V17|Ma|wN|V18|ds|V19|ou|ZzR|av|V20|uz|V21|kK|oa|V22|St|V23|IW|V24|Qh|V25|Oz|V26|YA|V27|qk|V28|vj|LU|V29|CX|V30|md|V31|Bm|V32|Ya|V33|Ww|V34|G1|V35|fl|V36|UK|V37|wM|V38|F1|V39|qZ|V40|ov|oEY|kn|V41|fI|V42|zM|V43|Rk|V44|Ti|KAf|CY|V45|nm|V46|uw|I5|V47|el"},
 zw:{
 "^":"Gv;",
 $isWO:true,
-$asWO:function(){return[W.M5]},
+$asWO:function(){return[W.QI]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.M5]},
+$isQV:true,
+$asQV:function(){return[W.QI]},
 "%":"EntryArray"},
 Ps:{
-"^":"Bo;N:target=,t5:type%,mH:href=",
+"^":"Bo;N:target=,t5:type%,mH:href=,yv:protocol=",
 bu:function(a){return a.toString()},
 "%":"HTMLAnchorElement"},
 fY:{
-"^":"Bo;N:target=,mH:href=",
+"^":"Bo;N:target=,mH:href=,yv:protocol=",
 bu:function(a){return a.toString()},
 "%":"HTMLAreaElement"},
 rZg:{
@@ -7246,7 +7506,7 @@
 Oi:{
 "^":"Gv;",
 "%":";CanvasRenderingContext"},
-mj:{
+FT:{
 "^":"Oi;",
 A8:function(a,b,c,d,e,f,g,h){var z
 if(g!=null)z=!0
@@ -7285,37 +7545,37 @@
 ek:function(a,b,c){return a.importNode(b,c)},
 Wk:function(a,b){return a.querySelector(b)},
 gi9:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.RO(a,C.pi.Ph,!1),[null])},
+gVl:function(a){return H.VM(new W.RO(a,C.nI.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
-Md:function(a,b){return W.Ot(a.querySelectorAll(b),null)},
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 $isQF:true,
 "%":"Document|HTMLDocument|XMLDocument"},
 Aj:{
 "^":"KV;",
 gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
 return a._docChildren},
-Md:function(a,b){return W.Ot(a.querySelectorAll(b),null)},
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 Wk:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
 rz:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
-Nh:{
+BK:{
 "^":"Gv;G1:message=",
 goc:function(a){var z=a.name
 if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
 if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
 return z},
 bu:function(a){return a.toString()},
-$isNh:true,
+$isBK:true,
 "%":"DOMException"},
 h4:{
 "^":"KV;xr:className%,jO:id=,ns:tagName=",
 gQg:function(a){return new W.E9(a)},
 gks:function(a){return new W.VG(a,a.children)},
-Md:function(a,b){return W.Ot(a.querySelectorAll(b),null)},
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
-gD7:function(a){return P.Ci(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
+gD7:function(a){return P.T7(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
 Es:function(a){this.q0(a)},
 dQ:function(a){this.Nz(a)},
 q0:function(a){},
@@ -7341,7 +7601,7 @@
 Zi:function(a){return a.getBoundingClientRect()},
 Wk:function(a,b){return a.querySelector(b)},
 gi9:function(a){return H.VM(new W.Cq(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.Cq(a,C.pi.Ph,!1),[null])},
+gVl:function(a){return H.VM(new W.Cq(a,C.nI.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])},
 gVY:function(a){return H.VM(new W.Cq(a,C.uh.Ph,!1),[null])},
 gf0:function(a){return H.VM(new W.Cq(a,C.Kq.Ph,!1),[null])},
@@ -7364,11 +7624,11 @@
 PZ:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
-On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
+YJ:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
 Si:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
 $isPZ:true,
 "%":";EventTarget"},
-EN:{
+hD:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLFieldSetElement"},
 hH:{
@@ -7397,15 +7657,15 @@
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 fJ:{
-"^":"rk;il:responseText=,pf:status=",
+"^":"rk;xN:responseText=,pf:status=",
 gbA:function(a){return W.Z9(a.response)},
-Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
-eo:function(a,b,c,d){return a.open(b,c,d)},
+R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
+kP:function(a,b,c,d){return a.open(b,c,d)},
 wR:function(a,b){return a.send(b)},
 $isfJ:true,
 "%":"XMLHttpRequest"},
@@ -7434,7 +7694,7 @@
 ttH:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-wP:{
+pL:{
 "^":"Bo;P:value%",
 "%":"HTMLLIElement"},
 eP:{
@@ -7447,7 +7707,7 @@
 "^":"Bo;mH:href=,t5:type%",
 "%":"HTMLLinkElement"},
 cS:{
-"^":"Gv;mH:href=",
+"^":"Gv;mH:href=,yv:protocol=",
 VD:function(a){return a.reload()},
 bu:function(a){return a.toString()},
 "%":"Location"},
@@ -7463,10 +7723,10 @@
 mCi:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
-Y7:{
+Br:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
-aB:{
+aBv:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
 W7:{
@@ -7497,11 +7757,11 @@
 if(!!a.offsetX)return H.VM(new P.EX(a.offsetX,a.offsetY),[null])
 else{if(!J.x(W.qc(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
 z=W.qc(a.target)
-y=H.VM(new P.EX(a.clientX,a.clientY),[null]).W(0,J.Yq(J.AK(z)))
+y=H.VM(new P.EX(a.clientX,a.clientY),[null]).W(0,J.Yq(J.mB(z)))
 return H.VM(new P.EX(J.Kn(y.x),J.Kn(y.y)),[null])}},
 $isOq:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-ih:{
+qT:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
@@ -7523,7 +7783,7 @@
 return z==null?J.Gv.prototype.bu.call(this,a):z},
 mx:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
-FO:function(a,b,c){return a.insertBefore(b,c)},
+mK:function(a,b,c){return a.insertBefore(b,c)},
 dR:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
@@ -7543,22 +7803,22 @@
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"NodeList|RadioNodeList"},
-VSm:{
+yd:{
 "^":"Bo;t5:type%",
 "%":"HTMLOListElement"},
-qb:{
+G77:{
 "^":"Bo;Rn:data=,MB:form=,fg:height},oc:name%,t5:type%,R:width}",
 "%":"HTMLObjectElement"},
 l9:{
 "^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
-UC:{
+Ea:{
 "^":"Bo;MB:form=,vH:index=,ph:label%,P:value%",
-$isUC:true,
+$isEa:true,
 "%":"HTMLOptionElement"},
 Xp:{
 "^":"Bo;MB:form=,oc:name%,t5:type=,P:value%",
@@ -7569,7 +7829,7 @@
 j6:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
-Qls:{
+qW:{
 "^":"Zl;N:target=",
 "%":"ProcessingInstruction"},
 KR:{
@@ -7594,7 +7854,7 @@
 Kb:function(a,b){return a.getElementById(b)},
 $isI0:true,
 "%":"ShadowRoot"},
-QR:{
+yNV:{
 "^":"Bo;t5:type%",
 "%":"HTMLSourceElement"},
 GA:{
@@ -7603,7 +7863,7 @@
 yg:{
 "^":"Gv;",
 "%":"SpeechInputResult"},
-Cz:{
+Hd:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
 vt:{
@@ -7612,7 +7872,7 @@
 my:{
 "^":"Gv;V5:isFinal=,B:length=",
 "%":"SpeechRecognitionResult"},
-er:{
+KKC:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
 kI:{
@@ -7625,7 +7885,7 @@
 "^":"Bo;",
 $isv6:true,
 "%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
-R1:{
+inA:{
 "^":"Bo;",
 gWT:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableElement"},
@@ -7633,13 +7893,13 @@
 "^":"Bo;RH:rowIndex=",
 $istV:true,
 "%":"HTMLTableRowElement"},
-Ix:{
+TR:{
 "^":"Bo;",
 gWT:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
-yY:{
+OH:{
 "^":"Bo;jb:content=",
-$isyY:true,
+$isOH:true,
 "%":"HTMLTemplateElement"},
 Un:{
 "^":"Zl;",
@@ -7661,20 +7921,20 @@
 SW:{
 "^":"eL;fg:height},R:width}",
 "%":"HTMLVideoElement"},
-u9:{
+K5:{
 "^":"PZ;oc:name%,pf:status%",
 geT:function(a){return W.Pv(a.parent)},
-xO:function(a){return a.close()},
+S6:function(a){return a.close()},
 kr:function(a,b,c,d){a.postMessage(P.bL(b),c)
 return},
 D9:function(a,b,c){return this.kr(a,b,c,null)},
 bu:function(a){return a.toString()},
 gi9:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
-$isu9:true,
+$isK5:true,
 $isPZ:true,
 "%":"DOMWindow|Window"},
-UMS:{
+Bn:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
 o5:{
@@ -7707,11 +7967,11 @@
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
-yX:{
+NfA:{
 "^":"Bo;",
 $isPZ:true,
 "%":"HTMLFrameSetElement"},
-QV:{
+rhM:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -7727,11 +7987,11 @@
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"MozNamedAttrMap|NamedNodeMap"},
-Tr:{
+mNY:{
 "^":"x5e;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -7747,8 +8007,8 @@
 $isWO:true,
 $asWO:function(){return[W.yg]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.yg]},
+$isQV:true,
+$asQV:function(){return[W.yg]},
 $isXj:true,
 "%":"SpeechInputResultList"},
 LO:{
@@ -7767,8 +8027,8 @@
 $isWO:true,
 $asWO:function(){return[W.my]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.my]},
+$isQV:true,
+$asQV:function(){return[W.my]},
 $isXj:true,
 "%":"SpeechRecognitionResultList"},
 VG:{
@@ -7793,7 +8053,7 @@
 Jd:function(a){return this.XP(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-aP:function(a,b,c){var z,y,x
+xe:function(a,b,c){var z,y,x
 if(b>this.VO.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.VO
 y=z.length
@@ -7801,14 +8061,15 @@
 if(b===y)x.appendChild(c)
 else{if(b>=y)return H.e(z,b)
 x.insertBefore(c,z[b])}},
-Mh:function(a,b,c){throw H.b(P.SY(null))},
+Yj:function(a,b,c){throw H.b(P.SY(null))},
 V1:function(a){J.r4(this.MW)},
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asrm:function(){return[W.h4]},
+$aseD:function(){return[W.h4]},
 $asWO:function(){return[W.h4]},
-$ascX:function(){return[W.h4]}},
+$asQV:function(){return[W.h4]}},
 TS:{
 "^":"rm;Sn,Sc",
 gB:function(a){return this.Sn.length},
@@ -7823,21 +8084,21 @@
 gDD:function(a){return W.or(this.Sc)},
 gi9:function(a){return H.VM(new W.Uc(this,!1,C.U3.Ph),[null])},
 gLm:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
-nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.HU())
+S8:function(a,b){var z=C.t5.ev(this.Sn,new W.HU())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null,
-static:{Ot:function(a,b){var z=H.VM(new W.TS(a,null),[b])
-z.nJ(a,b)
+$isQV:true,
+$asQV:null,
+static:{vD:function(a,b){var z=H.VM(new W.TS(a,null),[b])
+z.S8(a,b)
 return z}}},
 HU:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
-M5:{
+QI:{
 "^":"Gv;"},
 Jn:{
 "^":"a;WK<",
@@ -7855,25 +8116,25 @@
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 ecX:{
 "^":"RAp+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
-Kx:{
-"^":"Xs:10;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,92,"call"],
+$isQV:true,
+$asQV:function(){return[W.KV]}},
+KxY:{
+"^":"Tp:10;",
+$1:[function(a){return J.Du(a)},"$1",null,2,0,null,107,"call"],
 $isEH:true},
-Cs:{
-"^":"Xs:51;a",
+bU2:{
+"^":"Tp:67;a",
 $2:function(a,b){this.a.setRequestHeader(a,b)},
 $isEH:true},
 bU:{
-"^":"Xs:10;b,c",
+"^":"Tp:10;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -7892,7 +8153,7 @@
 h:function(a,b){this.NL.appendChild(b)},
 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)},
-aP:function(a,b,c){var z,y,x
+xe:function(a,b,c){var z,y,x
 if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.NL
 y=z.childNodes
@@ -7904,8 +8165,8 @@
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.Qk(z,c,y[b])},
-Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
+J.nt(z,c,y[b])},
+Yj:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
 V1:function(a){J.r4(this.NL)},
 u:function(a,b,c){var z,y
 z=this.NL
@@ -7924,64 +8185,65 @@
 return z[b]},
 $iswi:true,
 $asrm:function(){return[W.KV]},
+$aseD:function(){return[W.KV]},
 $asWO:function(){return[W.KV]},
-$ascX:function(){return[W.KV]}},
+$asQV:function(){return[W.KV]}},
 nNL:{
 "^":"Gv+lD;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 w1p:{
 "^":"nNL+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 yoo:{
 "^":"Gv+lD;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 kEI:{
 "^":"yoo+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 zLC:{
 "^":"Gv+lD;",
 $isWO:true,
 $asWO:function(){return[W.yg]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.yg]}},
+$isQV:true,
+$asQV:function(){return[W.yg]}},
 x5e:{
 "^":"zLC+Gm;",
 $isWO:true,
 $asWO:function(){return[W.yg]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.yg]}},
+$isQV:true,
+$asQV:function(){return[W.yg]}},
 dxW:{
 "^":"Gv+lD;",
 $isWO:true,
 $asWO:function(){return[W.my]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.my]}},
+$isQV:true,
+$asQV:function(){return[W.my]}},
 HRa:{
 "^":"dxW+Gm;",
 $isWO:true,
 $asWO:function(){return[W.my]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.my]}},
+$isQV:true,
+$asQV:function(){return[W.my]}},
 a7B:{
 "^":"a;",
 FV:function(a,b){J.kH(b,new W.Zc(this))},
@@ -8007,7 +8269,7 @@
 $isZ0:true,
 $asZ0:function(){return[P.qU,P.qU]}},
 Zc:{
-"^":"Xs:51;a",
+"^":"Tp:67;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 E9:{
@@ -8031,20 +8293,20 @@
 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)},
 OS:function(a){this.Kd.aN(0,new W.vf(a))},
-yJ:function(a){this.Kd=H.VM(new H.lJ(P.F(this.QX,!0,null),new W.Xw()),[null,null])},
+yJ:function(a){this.Kd=H.VM(new H.lJ(P.F(this.QX,!0,null),new W.Zu()),[null,null])},
 static:{or:function(a){var z=new W.ye(a,null)
 z.yJ(a)
 return z}}},
-Xw:{
-"^":"Xs:10;",
+Zu:{
+"^":"Tp:10;",
 $1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Si:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a.FV(0,a.lF())},
 $isEH:true},
 vf:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){return a.OS(this.a)},
 $isEH:true},
 I4:{
@@ -8055,10 +8317,10 @@
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))}},
-pq:{
+FkO:{
 "^":"a;Ph",
-zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
-LX:function(a){return this.zc(a,!1)}},
+DT:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
+LX:function(a){return this.DT(a,!1)}},
 RO:{
 "^":"cb;bi,Ph,Sg",
 KR:function(a,b,c,d){var z=new W.fd(0,this.bi,this.Ph,W.aF(a),this.Sg)
@@ -8070,14 +8332,14 @@
 Cq:{
 "^":"RO;bi,Ph,Sg",
 WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"cb",0)])
-return H.VM(new P.c9(new W.rg(b),z),[H.ip(z,"cb",0),null])},
+return H.VM(new P.c9(new W.tS(b),z),[H.ip(z,"cb",0),null])},
 $iscb:true},
 ie:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
-rg:{
-"^":"Xs:10;b",
+tS:{
+"^":"Tp:10;b",
 $1:[function(a){J.SS(a,this.b)
 return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
@@ -8097,11 +8359,11 @@
 yI:function(a){return this.KR(a,null,null,null)},
 $iscb:true},
 i2:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
 b0:{
-"^":"Xs:10;b",
+"^":"Tp:10;b",
 $1:[function(a){J.SS(a,this.b)
 return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
@@ -8114,12 +8376,12 @@
 return},
 Fv:[function(a,b){if(this.bi==null)return;++this.VP
 this.Jc()
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,83,20,84],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,99,20,100],
 gUF:function(){return this.VP>0},
-QE:[function(a){if(this.bi==null||this.VP<=0)return;--this.VP
+zl:[function(a){if(this.bi==null||this.VP<=0)return;--this.VP
 this.Zz()},"$0","gDQ",0,0,15],
 Zz:function(){var z=this.G9
-if(z!=null&&this.VP<=0)J.cZ(this.bi,this.Ph,z,this.Sg)},
+if(z!=null&&this.VP<=0)J.FI(this.bi,this.Ph,z,this.Sg)},
 Jc:function(){var z=this.G9
 if(z!=null)J.pW(this.bi,this.Ph,z,this.Sg)}},
 qO:{
@@ -8128,16 +8390,16 @@
 z=this.uZ
 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()))},
+z.u(0,b,b.zC(y.ght(y),new W.rC(this,b),this.aV.gGj()))},
 Rz:function(a,b){var z=this.uZ.Rz(0,b)
 if(z!=null)z.ed()},
-xO:[function(a){var z,y
+S6:[function(a){var z,y
 for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.xO(0)},"$0","gJK",0,0,15],
+this.aV.S6(0)},"$0","gJK",0,0,15],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
-RX:{
-"^":"Xs:42;a,b",
+rC:{
+"^":"Tp:64;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Gm:{
@@ -8147,17 +8409,17 @@
 FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 XP:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
 Jd:function(a){return this.XP(a,null)},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
-Mh:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
+Yj:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 uB:{
 "^":"rm;xa",
 gA:function(a){return H.VM(new W.LV(J.mY(this.xa)),[null])},
@@ -8177,7 +8439,7 @@
 u8:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){return J.ff(this.xa,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-aP:function(a,b,c){return J.Mx(this.xa,b,c)},
+xe:function(a,b,c){return J.Vk(this.xa,b,c)},
 YW:function(a,b,c,d,e){J.VZ(this.xa,b,c,d,e)},
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){J.ul(this.xa,b,c)}},
@@ -8196,21 +8458,21 @@
 this.Nq=y
 return!1},
 gl:function(){return this.QZ}},
-vZ:{
-"^":"Xs:10;a,b",
+uY:{
+"^":"Tp:10;a,b",
 $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)},"$1",null,2,0,null,32,"call"],
+return this.a(a)},"$1",null,2,0,null,51,"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
-xO:function(a){return this.Ui.close()},
-kr:function(a,b,c,d){this.Ui.postMessage(b,c)},
+S6:function(a){return this.Ui.close()},
+kr:function(a,b,c,d){this.Ui.postMessage(P.bL(b),c)},
 D9:function(a,b,c){return this.kr(a,b,c,null)},
 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."))},
+YJ:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Si:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isPZ:true,
 static:{P1:function(a){if(a===window)return a
@@ -8222,102 +8484,102 @@
 "%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
 "^":"",
 Y0:{
-"^":"tpr;N:target=,mH:href=",
+"^":"zp;N:target=,mH:href=",
 "%":"SVGAElement"},
 ZJQ:{
 "^":"Pt;mH:href=",
 "%":"SVGAltGlyphElement"},
-Bc:{
-"^":"d5;yG:result=,x=,y=",
+jwG:{
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEBlendElement"},
-lvr:{
-"^":"d5;t5:type=,UQ:values=,yG:result=,x=,y=",
+bd:{
+"^":"MB;t5:type=,UQ:values=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 R8:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
 nQ:{
-"^":"d5;xS:operator=,yG:result=,x=,y=",
+"^":"MB;xS:operator=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
 B3:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
 wfu:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
 ha:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEFloodElement"},
 mz:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
-Ob:{
-"^":"d5;yG:result=,x=,y=,mH:href=",
+vz:{
+"^":"MB;yG:result=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
-bO:{
-"^":"d5;yG:result=,x=,y=",
+Tf:{
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEMergeElement"},
-wC:{
-"^":"d5;xS:operator=,yG:result=,x=,y=",
+yum:{
+"^":"MB;xS:operator=,yG:result=,x=,y=",
 "%":"SVGFEMorphologyElement"},
 MI:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEOffsetElement"},
-Ub:{
-"^":"d5;x=,y=",
+rg:{
+"^":"MB;x=,y=",
 "%":"SVGFEPointLightElement"},
-xX:{
-"^":"d5;yG:result=,x=,y=",
+bMB:{
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
-FG:{
-"^":"d5;x=,y=",
+HAk:{
+"^":"MB;x=,y=",
 "%":"SVGFESpotLightElement"},
-Rg:{
-"^":"d5;yG:result=,x=,y=",
+Qya:{
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
-"^":"d5;t5:type=,yG:result=,x=,y=",
+"^":"MB;t5:type=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
-QN:{
-"^":"d5;x=,y=,mH:href=",
+OE5:{
+"^":"MB;x=,y=,mH:href=",
 "%":"SVGFilterElement"},
 mg:{
-"^":"tpr;x=,y=",
+"^":"zp;x=,y=",
 "%":"SVGForeignObjectElement"},
-en:{
-"^":"tpr;",
+TQ:{
+"^":"zp;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
-tpr:{
-"^":"d5;",
+zp:{
+"^":"MB;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 SL:{
-"^":"tpr;x=,y=,mH:href=",
+"^":"zp;x=,y=,mH:href=",
 "%":"SVGImageElement"},
 NBZ:{
-"^":"d5;x=,y=",
+"^":"MB;x=,y=",
 "%":"SVGMaskElement"},
 Ac:{
-"^":"d5;x=,y=,mH:href=",
+"^":"MB;x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-MU:{
-"^":"en;x=,y=",
+NJ:{
+"^":"TQ;x=,y=",
 "%":"SVGRectElement"},
 nd:{
-"^":"d5;t5:type%,mH:href=",
+"^":"MB;t5:type%,mH:href=",
 "%":"SVGScriptElement"},
 EUL:{
-"^":"d5;t5:type%",
+"^":"MB;t5:type%",
 "%":"SVGStyleElement"},
-d5:{
+MB:{
 "^":"h4;",
 gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
 return a._cssClassSet},
 gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
 gi9:function(a){return H.VM(new W.Cq(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.Cq(a,C.pi.Ph,!1),[null])},
+gVl:function(a){return H.VM(new W.Cq(a,C.nI.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])},
 gVY:function(a){return H.VM(new W.Cq(a,C.uh.Ph,!1),[null])},
 gf0:function(a){return H.VM(new W.Cq(a,C.Kq.Ph,!1),[null])},
@@ -8325,24 +8587,24 @@
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|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",
 static:{"^":"OY<"}},
 hy:{
-"^":"tpr;x=,y=",
+"^":"zp;x=,y=",
 Kb:function(a,b){return a.getElementById(b)},
 $ishy:true,
 "%":"SVGSVGElement"},
 mHq:{
-"^":"tpr;",
+"^":"zp;",
 "%":";SVGTextContentElement"},
-iy:{
+xN:{
 "^":"mHq;Sf:method=,mH:href=",
 "%":"SVGTextPathElement"},
 Pt:{
 "^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
 ci:{
-"^":"tpr;x=,y=,mH:href=",
+"^":"zp;x=,y=,mH:href=",
 "%":"SVGUseElement"},
 cuU:{
-"^":"d5;mH:href=",
+"^":"MB;mH:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
 O7:{
 "^":"As3;LO",
@@ -8354,20 +8616,20 @@
 if(w.length!==0)y.h(0,w)}return y},
 p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
 "^":"",
-Hj:{
+QmI:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
-hq:{
+wC:{
 "^":"a;",
-$ishq:true,
+$iswC:true,
 static:{Jz:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
 xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,37,38,39,40],
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,38,56,24,57],
 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},
@@ -8377,25 +8639,25 @@
 if(a==null)return
 else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 else{z=J.x(a)
-if(!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isu9)return a
-else if(!!z.$isiP)return H.U8(a)
+if(!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isK5)return a
+else 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()))}},"$1","En",2,0,10,41],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,10,58],
 hE:function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 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=!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isu9}else z=!1
+z=!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isK5}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
-else return P.pL(a)}},"$1","Xl",2,0,27,41],
-pL:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
-else if(a instanceof Array)return P.iQ(a,$.jl(),new P.Jd())
-else return P.iQ(a,$.jl(),new P.QS())},
+else return P.ND(a)}},"$1","Xl",2,0,46,58],
+ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
+else if(a instanceof Array)return P.iQ(a,$.LZ(),new P.Jd())
+else return P.iQ(a,$.LZ(),new P.QS())},
 iQ:function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.$1(a)
 P.Dm(a,b,z)}return z},
@@ -8413,23 +8675,23 @@
 try{z=String(this.eh)
 return z}catch(y){H.Ru(y)
 return P.a.prototype.bu.call(this,this)}},
-K9:function(a,b){var z,y
+V7:function(a,b){var z,y
 z=this.eh
 y=b==null?null:P.F(H.VM(new H.lJ(b,P.En()),[null,null]),!0,null)
 return P.dU(z[a].apply(z,y))},
-nQ:function(a){return this.K9(a,null)},
+nQ:function(a){return this.V7(a,null)},
 $isE4:true,
 static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
-if(b==null)return P.pL(new z())
+if(b==null)return P.ND(new z())
 y=[null]
 C.Nm.FV(y,H.VM(new H.lJ(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.pL(new x())},Oe:function(a){if(a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
-return P.pL(P.wY(a))},jT:function(a){return P.pL(P.M0(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
+return P.ND(new x())},Oe:function(a){if(a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
+return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
 Xb:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -8437,10 +8699,10 @@
 if(!!y.$isZ0){x={}
 z.u(0,a,x)
 for(z=J.mY(a.gvc());z.G();){w=z.gl()
-x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$iscX){v=[]
+x[w]=this.$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)},"$1",null,2,0,null,41,"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,58,"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh",
@@ -8465,12 +8727,12 @@
 if(typeof z==="number"&&z>>>0===z)return z
 throw H.b(P.w("Bad JsArray length"))},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:function(a,b){this.K9("push",[b])},
-FV:function(a,b){this.K9("push",b instanceof Array?b:P.F(b,!0,null))},
-aP:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
-this.K9("splice",[b,0,c])},
+h:function(a,b){this.V7("push",[b])},
+FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
+xe:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
+this.V7("splice",[b,0,c])},
 UZ:function(a,b,c){P.oY(b,c,this.gB(this))
-this.K9("splice",[b,c-b])},
+this.V7("splice",[b,c-b])},
 YW:function(a,b,c,d,e){var z,y,x
 z=this.gB(this)
 if(b<0||b>z)H.vh(P.TE(b,0,z))
@@ -8480,9 +8742,9 @@
 if(e<0)throw H.b(P.u(e))
 x=[b,y]
 C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
-this.K9("splice",x)},
+this.V7("splice",x)},
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-XP:function(a,b){this.K9("sort",[b])},
+XP:function(a,b){this.V7("sort",[b])},
 Jd:function(a){return this.XP(a,null)},
 static:{oY:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
 if(b<a||b>c)throw H.b(P.TE(b,a,c))}}},
@@ -8491,28 +8753,28 @@
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 DV:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},
 $isEH:true},
 Hp:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return new P.r7(a)},
 $isEH:true},
 Jd:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return H.VM(new P.Tz(a),[null])},
 $isEH:true},
 QS:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return new P.E4(a)},
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
@@ -8537,34 +8799,34 @@
 if(a>b)return a
 if(a<b)return b
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
-if(C.ON.gG0(b))return b
+if(C.YI.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
 return a},
 mgb:{
 "^":"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))
+j1:function(a){if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 return Math.random()*a>>>0}},
 vY:{
-"^":"a;AW,mK",
-hJ:function(){var z,y,x,w,v,u
-z=this.AW
+"^":"a;Pd,Ak",
+Ad:function(){var z,y,x,w,v,u
+z=this.Pd
 y=4294901760*z
 x=(y&4294967295)>>>0
 w=55905*z
 v=(w&4294967295)>>>0
-u=v+x+this.mK
+u=v+x+this.Ak
 z=(u&4294967295)>>>0
-this.AW=z
-this.mK=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+this.Pd=z
+this.Ak=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
 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))
+if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.hJ()
-return(this.AW&z)>>>0}do{this.hJ()
-y=this.AW
+if((a&z)===0){this.Ad()
+return(this.Pd&z)>>>0}do{this.Ad()
+y=this.Pd
 x=y%a}while(y-x+a>=4294967296)
 return x},
-XR:function(a){var z,y,x,w,v,u,t,s
+qR: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)
@@ -8586,20 +8848,20 @@
 v=(x<<31>>>0)+x
 u=(v&4294967295)>>>0
 y=C.jn.cU(v-u,4294967296)
-v=this.AW*1037
+v=this.Pd*1037
 t=(v&4294967295)>>>0
-this.AW=t
-s=(this.mK*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
-this.mK=s
-this.AW=(t^u)>>>0
-this.mK=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
-if(this.mK===0&&this.AW===0)this.AW=23063
-this.hJ()
-this.hJ()
-this.hJ()
-this.hJ()},
-static:{"^":"tgM,LA,y9",r2:function(a){var z=new P.vY(0,0)
-z.XR(a)
+this.Pd=t
+s=(this.Ak*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
+this.Ak=s
+this.Pd=(t^u)>>>0
+this.Ak=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
+if(this.Ak===0&&this.Pd===0)this.Pd=23063
+this.Ad()
+this.Ad()
+this.Ad()
+this.Ad()},
+static:{"^":"tgM,dB,JYU",r2:function(a){var z=new P.vY(0,0)
+z.qR(a)
 return z}}},
 EX:{
 "^":"a;x>,y>",
@@ -8705,7 +8967,7 @@
 "^":"IV;Bb>,G6>,R>,fg>",
 $istn:true,
 $astn:null,
-static:{Ci:function(a,b,c,d,e){var z,y
+static:{T7:function(a,b,c,d,e){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)z=-c*0
 else z=c
@@ -8716,7 +8978,7 @@
 "^":"",
 ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
 Gj:{
-"^":"mA;Ay"},
+"^":"mA;EV"},
 mA:{
 "^":"Nx+cw;",
 $isZ0:true},
@@ -8728,22 +8990,22 @@
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:function(a,b){return this.Ay.t(0,b)},
-u:function(a,b,c){this.Ay.u(0,b,c)},
-FV:function(a,b){this.Ay.FV(0,b)},
-V1:function(a){this.Ay.V1(0)},
-aN:function(a,b){this.Ay.aN(0,b)},
-gl0:function(a){return this.Ay.X5===0},
-gor:function(a){return this.Ay.X5!==0},
-gvc:function(){var z=this.Ay
+t:function(a,b){return this.EV.t(0,b)},
+u:function(a,b,c){this.EV.u(0,b,c)},
+FV:function(a,b){this.EV.FV(0,b)},
+V1:function(a){this.EV.V1(0)},
+aN:function(a,b){this.EV.aN(0,b)},
+gl0:function(a){return this.EV.X5===0},
+gor:function(a){return this.EV.X5!==0},
+gvc:function(){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gB:function(a){return this.Ay.X5},
-gUQ:function(a){var z=this.Ay
+gB:function(a){return this.EV.X5},
+gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
-bu:function(a){return P.vW(this.Ay)},
+bu:function(a){return P.vW(this.EV)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
-m6:function(a){a.toString
+ic:function(a){a.toString
 return a},
 jZN:function(a){a.toString
 return a},
@@ -8762,10 +9024,10 @@
 ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
 $ispF:true,
 $isAS:true,
-"%":";ArrayBufferView;vF|Nb|nA|Dg|Ui|GVy|Pg"},
+"%":";ArrayBufferView;we|Ob|GVy|Dg|Ui|Ipv|Pg"},
 di:{
 "^":"pF;",
-gbx:function(a){return C.nI},
+gbx:function(a){return C.T1},
 $isAS:true,
 "%":"DataView"},
 Hg:{
@@ -8780,8 +9042,8 @@
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.CP]},
+$isQV:true,
+$asQV:function(){return[P.CP]},
 $isAS:true,
 "%":"Float32Array"},
 K8Q:{
@@ -8796,11 +9058,11 @@
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.CP]},
+$isQV:true,
+$asQV:function(){return[P.CP]},
 $isAS:true,
 "%":"Float64Array"},
-Hd:{
+PS:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
 t:function(a,b){var z=a.length
@@ -8812,13 +9074,13 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"Int16Array"},
 dE5:{
 "^":"Pg;",
-gbx:function(a){return C.Im},
+gbx:function(a){return C.KS},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -8828,11 +9090,11 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"Int32Array"},
-Xn:{
+IJ:{
 "^":"Pg;",
 gbx:function(a){return C.la},
 t:function(a,b){var z=a.length
@@ -8844,8 +9106,8 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"Int8Array"},
 us:{
@@ -8860,8 +9122,8 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"Uint16Array"},
 rs:{
@@ -8876,8 +9138,8 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"Uint32Array"},
 eEV:{
@@ -8893,8 +9155,8 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6a:{
@@ -8910,11 +9172,11 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":";Uint8Array"},
-vF:{
+we:{
 "^":"pF;",
 gB:function(a){return a.length},
 oZ:function(a,b,c,d,e){var z,y,x
@@ -8930,7 +9192,7 @@
 a.set(d,b)},
 $isXj:true},
 Dg:{
-"^":"nA;",
+"^":"GVy;",
 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)},
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
@@ -8938,19 +9200,19 @@
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.CP]}},
-Nb:{
-"^":"vF+lD;",
+$isQV:true,
+$asQV:function(){return[P.CP]}},
+Ob:{
+"^":"we+lD;",
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.CP]}},
-nA:{
-"^":"Nb+Lj;"},
+$isQV:true,
+$asQV:function(){return[P.CP]}},
+GVy:{
+"^":"Ob+Lj;"},
 Pg:{
-"^":"GVy;",
+"^":"Ipv;",
 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)},
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
@@ -8958,16 +9220,16 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]}},
+$isQV:true,
+$asQV:function(){return[P.KN]}},
 Ui:{
-"^":"vF+lD;",
+"^":"we+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]}},
-GVy:{
+$isQV:true,
+$asQV:function(){return[P.KN]}},
+Ipv:{
 "^":"Ui+Lj;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
 "^":"",
 qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
@@ -8980,8 +9242,8 @@
 "^":"Vct;Py,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gkc:function(a){return a.Py},
 skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
-static:{Sj:function(a){var z,y,x,w
-z=$.J1()
+static:{Yw:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -8989,8 +9251,8 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.wI.ZL(a)
-C.wI.XI(a)
+C.OD.ZL(a)
+C.OD.XI(a)
 return a}}},
 Vct:{
 "^":"uL+Pi;",
@@ -9012,7 +9274,7 @@
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,70,1,71,72],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,86,1,87,88],
 Z1:[function(a,b,c,d){var z,y,x
 J.fD(b)
 z=a.a3
@@ -9020,13 +9282,13 @@
 if(a.Ln!=null){y=P.Fl(null,null)
 x=R.tB(y)
 J.kW(x,"expr",z)
-J.Mx(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,70,1,71,72],
+J.Vk(a.y4,0,x)
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,86,1,87,88],
 YC:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,93,1],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,108,1],
 static:{Rp:function(a){var z,y,x,w,v
 z=R.tB([])
-y=$.J1()
+y=$.XZ()
 x=P.YM(null,null,null,P.qU,W.I0)
 w=P.qU
 v=W.h4
@@ -9043,12 +9305,12 @@
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Xs:10;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,94,"call"],
+"^":"Tp:10;a",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,109,"call"],
 $isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Eg:{
-"^":"LPc;fe,l1,bY,jv,oy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"SaM;fe,l1,bY,jv,oy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gv8:function(a){return a.fe},
 sv8:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
 gph:function(a){return a.l1},
@@ -9065,9 +9327,9 @@
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Kz(a)).wM(new R.uv(a))}},"$3","gbN",6,0,55,24,25,56],
+this.LY(a,a.jv).ml(new R.uv(a)).wM(new R.Ou(a))}},"$3","gbN",6,0,71,43,44,72],
 static:{fL:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9083,24 +9345,24 @@
 C.UF.ZL(a)
 C.UF.XI(a)
 return a}}},
-LPc:{
+SaM:{
 "^":"ir+Pi;",
 $isd3:true},
-Kz:{
-"^":"Xs:95;a",
-$1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,61,"call"],
-$isEH:true},
 uv:{
-"^":"Xs:42;b",
+"^":"Tp:110;a",
+$1:[function(a){var z=this.a
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,77,"call"],
+$isEH:true},
+Ou:{
+"^":"Tp:64;b",
 $0:[function(){var z=this.b
 z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 i7:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-static:{dq:function(a){var z,y,x,w
-z=$.J1()
+static:{qb:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9117,9 +9379,9 @@
 "^":"WZq;KV,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-RF:[function(a,b){J.LE(a.KV).wM(b)},"$1","gVm",2,0,17,66],
+RF:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,17,82],
 static:{Sy:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9132,12 +9394,52 @@
 return a}}},
 WZq:{
 "^":"uL+Pi;",
+$isd3:true}}],["flag_list_element","package:observatory/src/elements/flag_list.dart",,X,{
+"^":"",
+Nr:{
+"^":"pva;DC,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gpM:function(a){return a.DC},
+spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
+RF:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,17,82],
+static:{na:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.uG.ZL(a)
+C.uG.XI(a)
+return a}}},
+pva:{
+"^":"uL+Pi;",
+$isd3:true},
+MJ:{
+"^":"cda;Zc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gJ6:function(a){return a.Zc},
+sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
+static:{Bs:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Cl.ZL(a)
+C.Cl.XI(a)
+return a}}},
+cda:{
+"^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 DK:{
-"^":"Zz;lh,Qz,zg,Fs,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gU4:function(a){return a.lh},
-sU4:function(a,b){a.lh=this.ct(a,C.QK,a.lh,b)},
+"^":"T53;ay,MC,oX,Oc,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gU4:function(a){return a.ay},
+sU4:function(a,b){a.ay=this.ct(a,C.QK,a.ay,b)},
 Qj:[function(a,b){var z,y,x
 Q.xI.prototype.Qj.call(this,a,b)
 this.ct(a,C.ak,0,1)
@@ -9146,28 +9448,28 @@
 y=z!=null
 if(y){x=J.U6(z)
 x=!J.xC(x.t(z,"kind"),"Collected")&&!J.xC(x.t(z,"kind"),"Native")&&!J.xC(x.t(z,"kind"),"Tag")&&!J.xC(x.t(z,"kind"),"Reused")}else x=!1
-a.Fs=this.ct(a,C.a0,a.Fs,x)
+a.Oc=this.ct(a,C.a0,a.Oc,x)
 x=y&&J.UQ(z,"parent")!=null
-a.Qz=this.ct(a,C.ak,a.Qz,x)
+a.MC=this.ct(a,C.ak,a.MC,x)
 if(y){y=J.U6(z)
 y=y.t(z,"owner")!=null&&J.xC(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.Ql,a.zg,y)},"$1","gLe",2,0,17,35],
-gSY:function(a){return a.Qz},
-sSY:function(a,b){a.Qz=this.ct(a,C.ak,a.Qz,b)},
-gE7:function(a){return a.zg},
-sE7:function(a,b){a.zg=this.ct(a,C.Ql,a.zg,b)},
-gni:function(a){return a.Fs},
-sni:function(a,b){a.Fs=this.ct(a,C.a0,a.Fs,b)},
+a.oX=this.ct(a,C.Ql,a.oX,y)},"$1","gLe",2,0,17,54],
+gSY:function(a){return a.MC},
+sSY:function(a,b){a.MC=this.ct(a,C.ak,a.MC,b)},
+gE7:function(a){return a.oX},
+sE7:function(a,b){a.oX=this.ct(a,C.Ql,a.oX,b)},
+gni:function(a){return a.Oc},
+sni:function(a,b){a.Oc=this.ct(a,C.a0,a.Oc,b)},
 static:{E5:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.lh=!0
-a.Qz=!1
-a.zg=!1
-a.Fs=!1
+a.ay=!0
+a.MC=!1
+a.oX=!1
+a.Oc=!1
 a.Pe=!1
 a.on=z
 a.BA=y
@@ -9175,12 +9477,12 @@
 C.Xo.ZL(a)
 C.Xo.XI(a)
 return a}}},
-Zz:{
+T53:{
 "^":"xI+Pi;",
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 BS:{
-"^":"pva;P6,Sq,ZZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"waa;P6,Sq,ZZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
 gUx:function(a){return a.Sq},
@@ -9228,10 +9530,10 @@
 case"kInvokeFieldDispatcher":a.ZZ=this.ct(a,C.Lc,y,"invoke field dispatcher")
 break
 default:a.ZZ=this.ct(a,C.Lc,y,"UNKNOWN")
-break}},"$1","gnp",2,0,17,35],
-RF:[function(a,b){J.LE(a.P6).wM(b)},"$1","gVm",2,0,17,66],
-static:{nz:function(a){var z,y,x,w
-z=$.J1()
+break}},"$1","gnp",2,0,17,54],
+RF:[function(a,b){J.LE(a.P6).wM(b)},"$1","gvC",2,0,17,82],
+static:{N0:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9239,16 +9541,16 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.p0.ZL(a)
-C.p0.XI(a)
+C.cI.ZL(a)
+C.cI.XI(a)
 return a}}},
-pva:{
+waa:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
 Hz:{
 "^":"a;zE,mS",
-m0:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,96],
+PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,111],
 gvH:function(a){return C.CD.cU(this.mS,4)},
 static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=b.gy(b)
@@ -9261,7 +9563,7 @@
 uc:{
 "^":"a;Yu<,tL"},
 Vb:{
-"^":"cda;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V3;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gpf:function(a){return a.PA},
 spf:function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},
 gyw:function(a){return a.oj},
@@ -9294,7 +9596,7 @@
 if(0>=u.length)return H.e(u,0)
 y.u(0,t,u[0])
 x.u(0,t,r)
-w.u(0,this.LV(a,r),t)}this.tn(a,c,"Free",$.aw())
+w.u(0,this.LV(a,r),t)}this.tn(a,c,"Free",$.Rl())
 this.tn(a,0,"",$.Sd())},
 WE:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.dW
@@ -9331,22 +9633,22 @@
 U8:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y=this.WE(a,z.gD7(b))
-x=H.d(y.tL)+"B @ 0x"+J.u1(y.Yu,16)
+x=H.d(y.tL)+"B @ 0x"+J.cR(y.Yu,16)
 z=z.gD7(b)
 z=O.x6(a.An,z)
 w=z.mS
 v=a.UL.t(0,a.Ge.t(0,this.LV(a,C.yp.Mu(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,93,60],
-f1:[function(a,b){var z=J.u1(this.WE(a,J.HF(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,93,60],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,108,76],
+X7:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,108,76],
 My:function(a){var z,y,x,w
 z=a.oj
 if(z==null||a.hi==null)return
 this.eD(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
 y=J.UQ(a.oj,"pages")
 z=a.hi.parentElement
-x=P.Ci(z.clientLeft,z.clientTop,z.clientWidth,z.clientHeight,null).R
+x=P.T7(z.clientLeft,z.clientTop,z.clientWidth,z.clientHeight,null).R
 z=J.Ts(J.Ts(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
 if(typeof z!=="number")return H.s(z)
 z=4+z
@@ -9407,13 +9709,13 @@
 P.Iw(new O.R5(a,b),null)},
 RF:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).wM(b)},"$1","gVm",2,0,17,66],
-nY:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,17,35],
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).wM(b)},"$1","gvC",2,0,17,82],
+nY:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,17,54],
 static:{"^":"nK,fM,SoT",pn:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
-w=$.J1()
+w=$.XZ()
 v=P.YM(null,null,null,P.qU,W.I0)
 u=P.qU
 t=W.h4
@@ -9424,32 +9726,32 @@
 a.on=w
 a.BA=v
 a.LL=t
-C.pJ.ZL(a)
-C.pJ.XI(a)
+C.Cs.ZL(a)
+C.Cs.XI(a)
 return a}}},
-cda:{
+V3:{
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
-"^":"Xs:42;a,b",
+"^":"Tp:64;a,b",
 $0:function(){J.fi(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"Xs:98;a",
+"^":"Tp:113;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,97,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,112,"call"],
 $isEH:true},
 aO:{
-"^":"Xs:51;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,99,"call"],
+"^":"Tp:67;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,114,"call"],
 $isEH:true},
 oc:{
-"^":"Xs:42;a",
+"^":"Tp:64;a",
 $0:function(){J.vP(this.a)},
 $isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 Ly:{
-"^":"waa;GQ,I8,Oc,GM,Rp,Ol,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V5;GQ,I8,JS,GM,Rp,Ol,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gLF:function(a){return a.Rp},
 sLF:function(a,b){a.Rp=this.ct(a,C.kG,a.Rp,b)},
 gB1:function(a){return a.Ol},
@@ -9486,7 +9788,7 @@
 p=this.zh(a,y,8)
 J.Jr(a.Rp,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.II(a.Rp)
 z=a.GQ.Yb
-z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
+z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=a.GQ
 x=J.U6(o)
@@ -9494,51 +9796,51 @@
 z=z.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
-z.K9("addRow",[H.VM(new P.Tz(v),[null])])
+z.V7("addRow",[H.VM(new P.Tz(v),[null])])
 v=a.GQ
 z=J.Hn(x.t(o,"capacity"),x.t(o,"used"))
 v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.K9("addRow",[H.VM(new P.Tz(w),[null])])
+v.V7("addRow",[H.VM(new P.Tz(w),[null])])
 w=a.GQ
 x=x.t(o,"external")
 w=w.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["External",x],P.En()))
-w.K9("addRow",[H.VM(new P.Tz(v),[null])])
-v=a.Oc.Yb
-v.K9("removeRows",[0,v.nQ("getNumberOfRows")])
+w.V7("addRow",[H.VM(new P.Tz(v),[null])])
+v=a.JS.Yb
+v.V7("removeRows",[0,v.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"old")
-v=a.Oc
+v=a.JS
 w=J.U6(o)
 x=w.t(o,"used")
 v=v.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["Used",x],P.En()))
-v.K9("addRow",[H.VM(new P.Tz(z),[null])])
-z=a.Oc
+v.V7("addRow",[H.VM(new P.Tz(z),[null])])
+z=a.JS
 v=J.Hn(w.t(o,"capacity"),w.t(o,"used"))
 z=z.Yb
 x=[]
 C.Nm.FV(x,C.Nm.ez(["Free",v],P.En()))
-z.K9("addRow",[H.VM(new P.Tz(x),[null])])
-x=a.Oc
+z.V7("addRow",[H.VM(new P.Tz(x),[null])])
+x=a.JS
 w=w.t(o,"external")
 x=x.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",w],P.En()))
-x.K9("addRow",[H.VM(new P.Tz(z),[null])])
+x.V7("addRow",[H.VM(new P.Tz(z),[null])])
 this.z5(a)},
 z5:function(a){var z=a.I8
 if(z==null)return
 z.W2(a.GQ)
-a.GM.W2(a.Oc)},
-AE:[function(a,b,c,d){var z,y
+a.GM.W2(a.JS)},
+BB:[function(a,b,c,d){var z,y
 if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
 if(z==null?y!=null:z!==y){a.Rp.sxp(y)
-J.II(a.Rp)}}},"$3","gQq",6,0,100,1,71,72],
+J.II(a.Rp)}}},"$3","gQq",6,0,115,1,87,88],
 K1:function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
@@ -9562,51 +9864,51 @@
 return J.ew(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.a9())},
 RF:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(new K.RM(a)).OA(new K.nx()).wM(b)},"$1","gVm",2,0,17,66],
-QH:[function(a,b){var z=a.Ol
+J.aT(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).wM(b)},"$1","gvC",2,0,17,82],
+zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).wM(b)},"$1","gyW",2,0,17,66],
+J.aT(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).wM(b)},"$1","gyW",2,0,17,82],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(new K.ke(a)).OA(new K.xj()).wM(b)},"$1","gNb",2,0,17,66],
-pM:[function(a,b){var z,y,x,w
+J.aT(z).cv("/allocationprofile?reset=true").ml(new K.ke(a)).OA(new K.xj()).wM(b)},"$1","gNb",2,0,17,82],
+n1:[function(a,b){var z,y,x,w
 try{this.MQ(a)}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
+y=new H.XO(x,null)
 N.QM("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.DS,[],this.gJN(a))},"$1","gd0",2,0,17,35],
+this.ct(a,C.DS,[],this.gJN(a))},"$1","gd0",2,0,17,54],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.Sy(J.L9(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,101,102],
+return C.CD.Sy(J.L9(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,116,117],
 uW:[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"))},"$1","gJN",2,0,101,102],
-F9:[function(a,b){var z,y
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,116,117],
+Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.r0(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,101,102],
+return J.r0(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,116,117],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
 a.GQ=new G.Kf(z)
-z.K9("addColumn",["string","Type"])
-a.GQ.Yb.K9("addColumn",["number","Size"])
+z.V7("addColumn",["string","Type"])
+a.GQ.Yb.V7("addColumn",["number","Size"])
 z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.Oc=new G.Kf(z)
-z.K9("addColumn",["string","Type"])
-a.Oc.Yb.K9("addColumn",["number","Size"])
+a.JS=new G.Kf(z)
+z.V7("addColumn",["string","Type"])
+a.JS.Yb.V7("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.Rp,new G.Vz([new G.YA("Class",G.Tp()),new G.YA("Accumulator Size (New)",G.Gt()),new G.YA("Accumulator (New)",G.xo()),new G.YA("Current Size (New)",G.Gt()),new G.YA("Current (New)",G.xo()),new G.YA("Accumulator Size (Old)",G.Gt()),new G.YA("Accumulator (Old)",G.xo()),new G.YA("Current Size (Old)",G.Gt()),new G.YA("Current (Old)",G.xo())],z,[],0,!0,null,null))
+z=this.ct(a,C.kG,a.Rp,new G.Vz([new G.zb("Class",G.HP()),new G.zb("Accumulator Size (New)",G.Fx()),new G.zb("Accumulator (New)",G.kh()),new G.zb("Current Size (New)",G.Fx()),new G.zb("Current (New)",G.kh()),new G.zb("Accumulator Size (Old)",G.Fx()),new G.zb("Accumulator (Old)",G.kh()),new G.zb("Current Size (Old)",G.Fx()),new G.zb("Current (Old)",G.kh())],z,[],0,!0,null,null))
 a.Rp=z
 z.sxp(1)},
-static:{"^":"IJv,bQj,kh,wh,r1K,b3,pC,DY2",le:function(a){var z,y,x,w
-z=$.J1()
+static:{"^":"IJv,bQj,kf,wh,r1K,d6,pC,DY2",Ut:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9618,41 +9920,41 @@
 C.Vc.XI(a)
 C.Vc.Zy(a)
 return a}}},
-waa:{
+V5:{
 "^":"uL+Pi;",
 $isd3:true},
-RM:{
-"^":"Xs:98;a",
-$1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,97,"call"],
-$isEH:true},
 nx:{
-"^":"Xs:51;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,99,"call"],
+"^":"Tp:113;a",
+$1:[function(a){var z=this.a
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,112,"call"],
+$isEH:true},
+jm:{
+"^":"Tp:67;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,114,"call"],
 $isEH:true},
 AN:{
-"^":"Xs:98;a",
+"^":"Tp:113;a",
 $1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,97,"call"],
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,112,"call"],
 $isEH:true},
 Ao:{
-"^":"Xs:51;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,99,"call"],
+"^":"Tp:67;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,114,"call"],
 $isEH:true},
 ke:{
-"^":"Xs:98;a",
+"^":"Tp:113;a",
 $1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,97,"call"],
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,112,"call"],
 $isEH:true},
 xj:{
-"^":"Xs:51;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,99,"call"],
+"^":"Tp:67;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,114,"call"],
 $isEH:true}}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:function(a){var z,y
 z=[]
-y=new P.Kk(new P.wF([],z),new P.rG(z),new P.rM(z)).$1(a)
-new P.Qa().$0()
+y=new P.Kk(new P.wF([],z),new P.rG(z),new P.fh(z)).$1(a)
+new P.uS().$0()
 return y},
 o7:function(a,b){var z=[]
 return new P.xL(b,new P.CA([],z),new P.D6(z),new P.KC(z)).$1(a)},
@@ -9669,7 +9971,7 @@
 $.Qz=z}z=z!==!0&&J.NT(window.navigator.userAgent,"WebKit",0)
 $.R6=z}return z},
 wF:{
-"^":"Xs:26;b,c",
+"^":"Tp:45;b,c",
 $1:function(a){var z,y,x
 z=this.b
 y=z.length
@@ -9679,23 +9981,23 @@
 return y},
 $isEH:true},
 rG:{
-"^":"Xs:103;d",
+"^":"Tp:118;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
-rM:{
-"^":"Xs:104;e",
+fh:{
+"^":"Tp:119;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
-Qa:{
-"^":"Xs:42;",
+uS:{
+"^":"Tp:64;",
 $0:function(){},
 $isEH:true},
 Kk:{
-"^":"Xs:10;f,UI,bK",
+"^":"Tp:10;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -9704,7 +10006,7 @@
 if(typeof a==="string")return a
 y=J.x(a)
 if(!!y.$isiP)return new Date(a.y3)
-if(!!y.$iswL)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$isKx)throw H.b(P.SY("structured clone of RegExp"))
 if(!!y.$ishH)return a
 if(!!y.$isO4)return a
 if(!!y.$isSg)return a
@@ -9729,11 +10031,11 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
 q1:{
-"^":"Xs:51;a,IU",
-$2:function(a,b){this.a.a[a]=this.IU.$1(b)},
+"^":"Tp:67;a,Gq",
+$2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
 $isEH:true},
 CA:{
-"^":"Xs:26;a,b",
+"^":"Tp:45;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -9743,19 +10045,19 @@
 return y},
 $isEH:true},
 D6:{
-"^":"Xs:103;c",
+"^":"Tp:118;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"Xs:104;d",
+"^":"Tp:119;d",
 $2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
 xL:{
-"^":"Xs:10;e,f,UI,bK",
+"^":"Tp:10;e,f,UI,bK",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -9795,9 +10097,12 @@
 return z},
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
-ez:[function(a,b){return this.lF().ez(0,b)},"$1","gIr",2,0,105,48],
-ev:function(a,b){return this.lF().ev(0,b)},
-Ft:[function(a,b){return this.lF().Ft(0,b)},"$1","git",2,0,106,48],
+ez:[function(a,b){var z=this.lF()
+return H.VM(new H.xy(z,b),[H.Kp(z,0),null])},"$1","gIr",2,0,120,28],
+ev:function(a,b){var z=this.lF()
+return H.VM(new H.U5(z,b),[H.Kp(z,0)])},
+Ft:[function(a,b){var z=this.lF()
+return H.VM(new H.zs(z,b),[H.Kp(z,0),null])},"$1","git",2,0,121,28],
 Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -9810,7 +10115,7 @@
 y=z.Rz(0,b)
 this.p5(z)
 return y},
-FV:function(a,b){this.OS(new P.WK(b))},
+FV:function(a,b){this.OS(new P.rl(b))},
 grZ:function(a){var z=this.lF().lX
 if(z==null)H.vh(P.w("No elements"))
 return z.gGc()},
@@ -9823,22 +10128,22 @@
 this.p5(z)
 return y},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.qU]}},
+$isQV:true,
+$asQV:function(){return[P.qU]}},
 Fe:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){return a.h(0,this.a)},
 $isEH:true},
-WK:{
-"^":"Xs:10;a",
+rl:{
+"^":"Tp:10;a",
 $1:function(a){return a.FV(0,this.a)},
 $isEH:true},
 uQ:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return a.V1(0)},
 $isEH:true},
 D7:{
-"^":"rm;NJ,iz",
+"^":"rm;Yn,iz",
 gye:function(){var z=this.iz
 return P.F(z.ev(z,new P.hT()),!0,W.h4)},
 aN:function(a,b){H.bQ(this.gye(),b)},
@@ -9859,12 +10164,12 @@
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){H.bQ(C.Nm.aM(this.gye(),b,c),new P.GS())},
 V1:function(a){J.r4(this.iz.NL)},
-aP:function(a,b,c){this.iz.aP(0,b,c)},
+xe:function(a,b,c){this.iz.xe(0,b,c)},
 UG:function(a,b,c){var z,y
 z=this.iz.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.Qk(z,c,y[b])},
+J.nt(z,c,y[b])},
 gB:function(a){return this.gye().length},
 t:function(a,b){var z=this.gye()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -9872,11 +10177,11 @@
 gA:function(a){var z=this.gye()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 GS:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.wp(a)},
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
@@ -9889,16 +10194,16 @@
 else if(J.xC(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.xC(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
 return Q.xI.prototype.gJp.call(this,a)},
-Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,42],
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,64],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.LE(z).ml(new B.qB(a)).wM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gNe",4,0,107,108,66],
+c.$0()}},"$2","gNe",4,0,122,123,82],
 static:{lu:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9911,28 +10216,28 @@
 C.EL.XI(a)
 return a}}},
 qB:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
 a.szz(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.xP,z.tY,a)
-y.ct(z,C.xP,0,1)},"$1",null,2,0,null,94,"call"],
+y.ct(z,C.xP,0,1)},"$1",null,2,0,null,109,"call"],
 $isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":"V5;Xh,f2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V8;Xh,f2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 ghf:function(a){return a.Xh},
 shf:function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},
 gIi:function(a){return a.f2},
 sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
-vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,67,68],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,109,69],
-ee:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,109,87],
-RF:[function(a,b){J.LE(a.Xh).wM(b)},"$1","gVm",2,0,17,66],
+vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,83,84],
+S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,124,85],
+ee:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,124,30],
+RF:[function(a,b){J.LE(a.Xh).wM(b)},"$1","gvC",2,0,17,82],
 static:{BN:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9943,22 +10248,22 @@
 C.ry.ZL(a)
 C.ry.XI(a)
 return a}}},
-V5:{
+V8:{
 "^":"uL+Pi;",
 $isd3:true},
 cL:{
-"^":"Xs:95;a",
+"^":"Tp:110;a",
 $1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,61,"call"],
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,77,"call"],
 $isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
 "^":"",
 L4:{
-"^":"V8;PM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V10;PM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-RF:[function(a,b){J.LE(a.PM).wM(b)},"$1","gVm",2,0,17,66],
+RF:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,17,82],
 static:{p4:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9969,16 +10274,31 @@
 C.za.ZL(a)
 C.za.XI(a)
 return a}}},
-V8:{
+V10:{
 "^":"uL+Pi;",
 $isd3:true},
+Mb:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{pD:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.Ag.ZL(a)
+C.Ag.XI(a)
+return a}}},
 mO:{
-"^":"V10;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V11;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gVm",2,0,17,66],
-static:{G7:function(a){var z,y,x,w
-z=$.J1()
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,82],
+static:{Ch:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9989,13 +10309,13 @@
 C.Ie.ZL(a)
 C.Ie.XI(a)
 return a}}},
-V10:{
+V11:{
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 static:{oB:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10008,11 +10328,11 @@
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V11;yR,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V12;yR,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-RF:[function(a,b){J.LE(a.yR).wM(b)},"$1","gVm",2,0,17,66],
-TY:[function(a){J.LE(a.yR).wM(new E.XB(a))},"$0","gW6",0,0,15],
+RF:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,17,82],
+TY:[function(a){J.LE(a.yR).wM(new E.eG(a))},"$0","gW6",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
 a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.gW6(a))},
 Nz:function(a){var z
@@ -10021,7 +10341,7 @@
 if(z!=null){z.ed()
 a.mZ=null}},
 static:{hm:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10032,13 +10352,266 @@
 C.NK.ZL(a)
 C.NK.XI(a)
 return a}}},
-V11:{
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
-XB:{
-"^":"Xs:42;a",
+eG:{
+"^":"Tp:64;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+$isEH:true},
+qh:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{Sc:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.wK.ZL(a)
+C.wK.XI(a)
+return a}}},
+oF:{
+"^":"V13;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gjx:function(a){return a.Cr},
+sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,82],
+static:{J3z:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Tl.ZL(a)
+C.Tl.XI(a)
+return a}}},
+V13:{
+"^":"uL+Pi;",
+$isd3:true},
+Q6:{
+"^":"V14;uv,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gj4:function(a){return a.uv},
+sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
+RF:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,17,82],
+static:{chF:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.to.ZL(a)
+C.to.XI(a)
+return a}}},
+V14:{
+"^":"uL+Pi;",
+$isd3:true},
+uE:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{eg:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.Rr.ZL(a)
+C.Rr.XI(a)
+return a}}},
+Zn:{
+"^":"V15;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gjx:function(a){return a.Cr},
+sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,82],
+static:{xK:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.ij.ZL(a)
+C.ij.XI(a)
+return a}}},
+V15:{
+"^":"uL+Pi;",
+$isd3:true},
+n5:{
+"^":"V16;h1,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gHy:function(a){return a.h1},
+sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
+RF:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,17,82],
+static:{xx:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.aV.ZL(a)
+C.aV.XI(a)
+return a}}},
+V16:{
+"^":"uL+Pi;",
+$isd3:true},
+Ma:{
+"^":"V17;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gjx:function(a){return a.Cr},
+sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,82],
+static:{Ii:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.iR.ZL(a)
+C.iR.XI(a)
+return a}}},
+V17:{
+"^":"uL+Pi;",
+$isd3:true},
+wN:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{wZ7:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.RVQ.ZL(a)
+C.RVQ.XI(a)
+return a}}},
+ds:{
+"^":"V18;wT,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gMZ:function(a){return a.wT},
+sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
+RF:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,17,82],
+Yk:[function(a){J.LE(a.wT).wM(new E.Gf(a))},"$0","guT",0,0,15],
+q0:function(a){Z.uL.prototype.q0.call(this,a)
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.guT(a))},
+Nz:function(a){var z
+Z.uL.prototype.Nz.call(this,a)
+z=a.mZ
+if(z!=null){z.ed()
+a.mZ=null}},
+static:{pI:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.wP.ZL(a)
+C.wP.XI(a)
+return a}}},
+V18:{
+"^":"uL+Pi;",
+$isd3:true},
+Gf:{
+"^":"Tp:64;a",
+$0:[function(){var z=this.a
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+$isEH:true},
+ou:{
+"^":"V19;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gjx:function(a){return a.Cr},
+sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,82],
+static:{dv:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.lX.ZL(a)
+C.lX.XI(a)
+return a}}},
+V19:{
+"^":"uL+Pi;",
+$isd3:true},
+av:{
+"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gEQ:function(a){return a.CB},
+sEQ:function(a,b){a.CB=this.ct(a,C.fV,a.CB,b)},
+static:{R7:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.CB=!1
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.Wa.ZL(a)
+C.Wa.XI(a)
+return a}}},
+ZzR:{
+"^":"xI+Pi;",
+$isd3:true},
+uz:{
+"^":"V20;RX,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gNN:function(a){return a.RX},
+Fn:function(a){return this.gNN(a).$0()},
+sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
+RF:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,17,82],
+Yk:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","guT",0,0,15],
+q0:function(a){Z.uL.prototype.q0.call(this,a)
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.guT(a))},
+Nz:function(a){var z
+Z.uL.prototype.Nz.call(this,a)
+z=a.mZ
+if(z!=null){z.ed()
+a.mZ=null}},
+static:{fr:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.bZ.ZL(a)
+C.bZ.XI(a)
+return a}}},
+V20:{
+"^":"uL+Pi;",
+$isd3:true},
+Cc:{
+"^":"Tp:64;a",
+$0:[function(){var z=this.a
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
@@ -10049,13 +10622,13 @@
 y=J.UQ(z,"threshold")
 x=this.ks
 if(x.length>0)return
-for(w=this.H,v=J.mY(J.EO(w)),u=this.YK;v.G();){t=v.gl()
+for(w=this.H,v=J.mY(J.Mx(w)),u=this.YK;v.G();){t=v.gl()
 s=J.L9(t.gAv(),w.gAv())
 if(typeof y!=="number")return H.s(y)
 if(!(s>y||J.L9(J.on(t).gDu(),u.Av)>y))continue
 x.push(X.SJ(z,u,t,this))}},
 cO:function(){},
-Nh:function(){return J.q8(J.EO(this.H))>0},
+Nh:function(){return J.q8(J.Mx(this.H))>0},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
@@ -10064,7 +10637,7 @@
 if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
 if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(z.gAv(),this.YK.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
+this.ki=G.dj(z.gAv(),this.YK.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.wV)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
 else this.Zn=H.d(J.Iz(y.gtT(z)))+" (Function)"
 if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
@@ -10079,11 +10652,11 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V12;ix,fv,y7,hZ,Jy,Cv,zo,fJ,XX,VH,EX,Hm=,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V21;ix,fv,y7,hZ,Jy,Cv,zo,fJ,XX,VH,EX,Hm=,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gB1:function(a){return a.ix},
 sB1:function(a,b){a.ix=this.ct(a,C.vb,a.ix,b)},
-gGq:function(a){return a.fv},
-sGq:function(a,b){a.fv=this.ct(a,C.He,a.fv,b)},
+gPL:function(a){return a.fv},
+sPL:function(a,b){a.fv=this.ct(a,C.He,a.fv,b)},
 gLW:function(a){return a.y7},
 sLW:function(a,b){a.y7=this.ct(a,C.Gs,a.y7,b)},
 gUo:function(a){return a.hZ},
@@ -10098,7 +10671,7 @@
 sQl:function(a,b){a.fJ=this.ct(a,C.zz,a.fJ,b)},
 gZA:function(a){return a.VH},
 sZA:function(a,b){a.VH=this.ct(a,C.TW,a.VH,b)},
-pM:[function(a,b){var z,y,x,w,v
+n1:[function(a,b){var z,y,x,w,v
 z=a.ix
 if(z==null)return
 y=J.UQ(z,"samples")
@@ -10117,17 +10690,17 @@
 z=G.mG(J.UQ(a.ix,"timeSpan"))
 a.fJ=this.ct(a,C.zz,a.fJ,z)
 z=a.XX
-v=C.ON.bu(z*100)+"%"
+v=C.YI.bu(z*100)+"%"
 a.zo=this.ct(a,C.aH,a.zo,v)
 J.aT(a.ix).N3(a.ix)
 J.kW(a.ix,"threshold",z)
-this.Dq(a)},"$1","gd0",2,0,17,35],
+this.Dq(a)},"$1","gd0",2,0,17,54],
 q0:function(a){var z=R.tB([])
 a.Hm=new G.XN(z,null,null)
 this.Dq(a)},
-m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,17,35],
+m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,17,54],
 RF:[function(a,b){var z="profile?tags="+H.d(a.VH)
-J.aT(a.ix).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gVm",2,0,17,66],
+J.aT(a.ix).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,17,82],
 Dq:function(a){if(a.ix==null)return
 this.a8(a)},
 a8:function(a){var z,y,x,w,v,u,t
@@ -10141,27 +10714,24 @@
 v.C4(0)
 u.FV(w,v.ks)}catch(t){w=H.Ru(t)
 y=w
-x=new H.oP(t,null)
-N.QM("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,110,63],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,110,63],
-YF:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+x=new H.XO(t,null)
+N.QM("").xH("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.WT),1))a.Hm.qU(0)
+this.ct(a,C.ep,null,a.Hm)},
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,125,79],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,125,79],
+YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.F8(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$istV)try{w=a.Hm
 v=J.IO(z)
 if(typeof v!=="number")return v.W()
-u=w.WT
-t=J.U6(u)
-z=t.t(u,v-1)
-if(z.r8()===!0)t.UG(u,t.u8(u,z)+1,J.EO(z))
-else w.FS(z)}catch(s){w=H.Ru(s)
+w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.oP(s,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,100,1,71,72],
+x=new H.XO(u,null)
+N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,115,1,87,88],
 static:{"^":"B6",os:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10178,22 +10748,22 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.bb.ZL(a)
-C.bb.XI(a)
+C.kS.ZL(a)
+C.kS.XI(a)
 return a}}},
-V12:{
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"Xs:98;a",
+"^":"Tp:113;a",
 $1:[function(a){var z=this.a
-z.ix=J.Q5(z,C.vb,z.ix,a)},"$1",null,2,0,null,111,"call"],
+z.ix=J.Q5(z,C.vb,z.ix,a)},"$1",null,2,0,null,126,"call"],
 $isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oa:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 static:{IB:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10207,11 +10777,11 @@
 return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 St:{
-"^":"V13;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V22;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{N5:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10219,20 +10789,20 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.nM.ZL(a)
-C.nM.XI(a)
+C.Hj.ZL(a)
+C.Hj.XI(a)
 return a}}},
-V13:{
+V22:{
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V14;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V23;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,112,11],
-jh:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,112,11],
+Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,127,11],
+jh:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,127,11],
 static:{dm:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10243,23 +10813,23 @@
 C.F2.ZL(a)
 C.F2.XI(a)
 return a}}},
-V14:{
+V23:{
 "^":"uL+Pi;",
 $isd3:true},
 GG:{
-"^":"Xs:10;a",
-$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,94,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,109,"call"],
 $isEH:true},
 r8:{
-"^":"Xs:10;a",
-$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,94,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,109,"call"],
 $isEH:true},
 Qh:{
-"^":"V15;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V24;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{Qj:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10267,18 +10837,18 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.rC.ZL(a)
-C.rC.XI(a)
+C.kd.ZL(a)
+C.kd.XI(a)
 return a}}},
-V15:{
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V16;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V25;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{RP:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10289,15 +10859,15 @@
 C.Ji.ZL(a)
 C.Ji.XI(a)
 return a}}},
-V16:{
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 vT:{
 "^":"a;Y0,WL",
 eC:function(a){var z,y,x,w,v,u
 z=this.Y0.Yb
-if(J.xC(z.nQ("getNumberOfColumns"),0)){z.K9("addColumn",["string","Name"])
-z.K9("addColumn",["number","Value"])}z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
+if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
+z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 for(y=J.mY(a.gvc()),x=J.U6(a);y.G();){w=y.gl()
 v=J.uH(x.t(a,w),"%")
 if(0>=v.length)return H.e(v,0)
@@ -10305,14 +10875,14 @@
 C.Nm.FV(u,C.Nm.ez([w,H.RR(v[0],null)],P.En()))
 u=new P.Tz(u)
 u.$builtinTypeInfo=[null]
-z.K9("addRow",[u])}}},
-Mc:{
-"^":"V17;wd,iF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gKE:function(a){return a.wd},
-sKE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
-ak:[function(a,b){var z,y,x
+z.V7("addRow",[u])}}},
+YA:{
+"^":"V26;wd,iF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gXE:function(a){return a.wd},
+sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
+ci:[function(a,b){var z,y,x
 if(a.wd==null)return
-if($.Xr().MM.Gv!==0&&a.iF==null)a.iF=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
+if($.Ib().MM.Gv!==0&&a.iF==null)a.iF=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
 z=a.iF
 if(z==null)return
 z.eC(a.wd)
@@ -10321,9 +10891,9 @@
 x=z.WL
 if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
 x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,17,35],
+z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,17,54],
 static:{BP:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10334,126 +10904,126 @@
 C.wQ.ZL(a)
 C.wQ.XI(a)
 return a}}},
-V17:{
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
-Lr:{
-"^":"a;Xr,Z5",
+EN:{
+"^":"a;X6,YT",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.Xr.Yb
-if(J.xC(z.nQ("getNumberOfColumns"),0)){z.K9("addColumn",["string","Time"])
+z=this.X6.Yb
+if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
 for(y=J.mY(a.gaf());y.G();){x=y.lo
 if(J.xC(x,"Idle"))continue
-z.K9("addColumn",["number",x])}}z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
+z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 w=J.UU(a.gaf(),"Idle")
 v=a.gij()
-for(u=0;u<a.glI().length;++u){y=a.glI()
+for(u=0;u<a.gFw().length;++u){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 t=y[u].SP
 s=[]
 if(t>0){if(typeof v!=="number")return H.s(v)
 s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 r=y[u].wZ
 if(r===0){q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].KE.length))break
+if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].KE.length))break
+if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
-y=y[u].KE
+y=y[u].XE
 if(q>=y.length)return H.e(y,q)
 s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
 C.Nm.FV(y,C.Nm.ez(s,P.En()))
 y=new P.Tz(y)
 y.$builtinTypeInfo=[null]
-z.K9("addRow",[y])}}},
+z.V7("addRow",[y])}}},
 qk:{
-"^":"V18;px,ii,LR,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-god:function(a){return a.px},
-sod:function(a,b){a.px=this.ct(a,C.rB,a.px,b)},
-vV:[function(a,b){var z=a.px
-return z.cv(J.ew(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,67,68],
-MJ:[function(a){a.px.m7().ml(new L.LX(a))},"$0","gPW",0,0,15],
+"^":"V27;ck,ts,LR,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+god:function(a){return a.ck},
+sod:function(a,b){a.ck=this.ct(a,C.rB,a.ck,b)},
+vV:[function(a,b){var z=a.ck
+return z.cv(J.ew(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,83,84],
+Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
-a.ii=P.ww(P.ii(0,0,0,0,0,1),this.gPW(a))},
+a.ts=P.ww(P.ii(0,0,0,0,0,1),this.gJD(a))},
 Nz:function(a){var z
 Z.uL.prototype.Nz.call(this,a)
-z=a.ii
+z=a.ts
 if(z!=null)z.ed()},
-RF:[function(a,b){J.LE(a.px).wM(b)},"$1","gVm",2,0,17,66],
-Fv:[function(a,b){return a.px.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,112,11],
-jh:[function(a,b){return a.px.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,112,11],
+RF:[function(a,b){J.LE(a.ck).wM(b)},"$1","gvC",2,0,17,82],
+Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,127,11],
+jh:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,127,11],
 static:{KM:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
-y=$.J1()
+y=$.XZ()
 x=P.YM(null,null,null,P.qU,W.I0)
 w=P.qU
 v=W.h4
 v=H.VM(new V.qC(P.YM(null,null,null,w,v),null,null),[w,v])
-a.LR=new L.Lr(new G.Kf(z),null)
+a.LR=new L.EN(new G.Kf(z),null)
 a.on=y
 a.BA=x
 a.LL=v
 C.Xe.ZL(a)
 C.Xe.XI(a)
 return a}}},
-V18:{
+V27:{
 "^":"uL+Pi;",
 $isd3:true},
 LX:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 y=z.LR
 y.eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
-if(x!=null){if(y.Z5==null){w=P.L5(null,null,null,null,null)
+if(x!=null){if(y.YT==null){w=P.L5(null,null,null,null,null)
 v=new G.qu(null,w)
 v.vR=P.zV(J.UQ($.BY,"SteppedAreaChart"),[x])
-y.Z5=v
+y.YT=v
 w.u(0,"isStacked",!0)
-y.Z5.bG.u(0,"connectSteps",!1)
-y.Z5.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.Z5.W2(y.Xr)}z.ii=P.ww(P.ii(0,0,0,0,0,1),J.yo(z))},"$1",null,2,0,null,113,"call"],
+y.YT.bG.u(0,"connectSteps",!1)
+y.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.YT.W2(y.X6)}z.ts=P.ww(P.ii(0,0,0,0,0,1),J.dq(z))},"$1",null,2,0,null,128,"call"],
 $isEH:true},
 CV:{
-"^":"Xs:10;a",
-$1:[function(a){return J.LE(this.a.px)},"$1",null,2,0,null,94,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,109,"call"],
 $isEH:true},
 Vq:{
-"^":"Xs:10;a",
-$1:[function(a){return J.LE(this.a.px)},"$1",null,2,0,null,94,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,109,"call"],
 $isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 xh:{
-"^":"a;hw,jc",
-KN:function(a,b){var z,y,x,w,v,u,t,s
-z=this.jc
+"^":"a;ue,GO",
+LE:function(a,b){var z,y,x,w,v,u,t,s
+z=this.GO
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.mY(a.gvc()),x=this.hw,w=J.U6(a),v=b+1;y.G();){u=y.gl()
+for(y=J.mY(a.gvc()),x=this.ue,w=J.U6(a),v=b+1;y.G();){u=y.gl()
 t=w.t(a,u)
 s=J.x(t)
 if(!!s.$isZ0){s=C.xB.U("  ",b)
 x.vM+=s
 s="\""+H.d(u)+"\": {\n"
 x.vM+=s
-this.KN(t,v)
+this.LE(t,v)
 s=C.xB.U("  ",b)
 s=x.vM+=s
 x.vM=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
 x.vM+=s
 s="\""+H.d(u)+"\": [\n"
 x.vM+=s
-this.HC(t,v)
+this.QC(t,v)
 s=C.xB.U("  ",b)
 s=x.vM+=s
 x.vM=s+"]\n"}else{s=C.xB.U("  ",b)
@@ -10461,22 +11031,22 @@
 s="\""+H.d(u)+"\": "+H.d(t)
 s=x.vM+=s
 x.vM=s+"\n"}}z.Rz(0,a)},
-HC:function(a,b){var z,y,x,w,v,u
-z=this.jc
+QC:function(a,b){var z,y,x,w,v,u
+z=this.GO
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.mY(a),x=this.hw,w=b+1;y.G();){v=y.gl()
+for(y=J.mY(a),x=this.ue,w=b+1;y.G();){v=y.gl()
 u=J.x(v)
 if(!!u.$isZ0){u=C.xB.U("  ",b)
 u=x.vM+=u
 x.vM=u+"{\n"
-this.KN(v,w)
+this.LE(v,w)
 u=C.xB.U("  ",b)
 u=x.vM+=u
 x.vM=u+"}\n"}else if(!!u.$isWO){u=C.xB.U("  ",b)
 u=x.vM+=u
 x.vM=u+"[\n"
-this.HC(v,w)
+this.QC(v,w)
 u=C.xB.U("  ",b)
 u=x.vM+=u
 x.vM=u+"]\n"}else{u=C.xB.U("  ",b)
@@ -10484,24 +11054,24 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V19;OZ,X7,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gIr:function(a){return a.OZ},
+"^":"V28;Ly,cs,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:function(a,b){a.OZ=this.ct(a,C.SR,a.OZ,b)},
-glp:function(a){return a.X7},
-slp:function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},
+sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
+glp:function(a){return a.cs},
+slp:function(a,b){a.cs=this.ct(a,C.t6,a.cs,b)},
 oC:[function(a,b){var z,y,x
 z=P.p9("")
 y=P.Ls(null,null,null,null)
-x=a.OZ
+x=a.Ly
 z.vM=""
 z.KF("{\n")
-new Z.xh(z,y).KN(x,0)
+new Z.xh(z,y).LE(x,0)
 z.KF("}\n")
 z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gdB",2,0,17,35],
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,17,54],
 static:{M7:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10512,14 +11082,14 @@
 C.Yt.ZL(a)
 C.Yt.XI(a)
 return a}}},
-V19:{
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 static:{rA:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10533,13 +11103,13 @@
 return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 CX:{
-"^":"V20;iI,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V29;iI,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.F8(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,67,68],
-RF:[function(a,b){J.LE(a.iI).wM(b)},"$1","gVm",2,0,17,66],
+vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.F8(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,83,84],
+RF:[function(a,b){J.LE(a.iI).wM(b)},"$1","gvC",2,0,17,82],
 static:{as:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10550,25 +11120,25 @@
 C.MG.ZL(a)
 C.MG.XI(a)
 return a}}},
-V20:{
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
 Rw:{
-"^":"a;oc>,eT>,qp,EV>,ks>,iL",
+"^":"a;oc>,eT>,n2,Cj>,ks>,Gs",
 gB8:function(){var z,y,x
 z=this.eT
 y=z==null||J.xC(J.O6(z),"")
 x=this.oc
 return y?x:z.gB8()+"."+x},
-gOR:function(){if($.RL){var z=this.qp
+gOR:function(){if($.RL){var z=this.n2
 if(z!=null)return z
 z=this.eT
 if(z!=null)return z.gOR()}return $.Y4},
-sOR:function(a){if($.RL&&this.eT!=null)this.qp=a
+sOR:function(a){if($.RL&&this.eT!=null)this.n2=a
 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.JG()},
+gSZ:function(){return this.IE()},
 Im:function(a){return a.P>=this.gOR().P},
 Y6:function(a,b,c,d){var z,y,x,w,v
 if(a.P>=this.gOR().P){z=this.gB8()
@@ -10577,31 +11147,31 @@
 x=$.Y1
 $.Y1=x+1
 w=new N.HV(a,b,z,y,x,c,d)
-if($.RL)for(v=this;v!=null;){v.mw(w)
-v=J.Lp(v)}else N.QM("").mw(w)}},
+if($.RL)for(v=this;v!=null;){v.cB(w)
+v=J.Lp(v)}else N.QM("").cB(w)}},
 X2:function(a,b,c){return this.Y6(C.Ab,a,b,c)},
 x9:function(a){return this.X2(a,null,null)},
-dL:function(a,b,c){return this.Y6(C.eI,a,b,c)},
-Ny:function(a){return this.dL(a,null,null)},
+dL:function(a,b,c){return this.Y6(C.t4,a,b,c)},
+J4:function(a){return this.dL(a,null,null)},
 ZW:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.ZW(a,null,null)},
 xH:function(a,b,c){return this.Y6(C.nT,a,b,c)},
 j2:function(a){return this.xH(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.Xm,a,b,c)},
 YX:function(a){return this.WB(a,null,null)},
-JG:function(){if($.RL||this.eT==null){var z=this.iL
+IE:function(){if($.RL||this.eT==null){var z=this.Gs
 if(z==null){z=P.bK(null,null,!0,N.HV)
-this.iL=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.QM("").JG()},
-mw:function(a){var z=this.iL
+this.Gs=z}z.toString
+return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.QM("").IE()},
+cB:function(a){var z=this.Gs
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)}},
 QL:function(a,b,c){var z=this.eT
-if(z!=null)J.rl(z).u(0,this.oc,this)},
+if(z!=null)J.Tr(z).u(0,this.oc,this)},
 $isRw:true,
 static:{"^":"Uj",QM:function(a){return $.Iu().to(a,new N.dG(a))}}},
 dG:{
-"^":"Xs:42;a",
+"^":"Tp:64;a",
 $0:function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
@@ -10635,46 +11205,43 @@
 giO:function(a){return this.P},
 bu:function(a){return this.oc},
 $isqV:true,
-static:{"^":"X9,tmj,Enk,LkO,tY,Fn,hlK,WE,Uu,lM,uxc"}},
+static:{"^":"X9,tmj,Enk,LkO,tY,Fn,dc,zE,Uu,lDu,uxc"}},
 HV:{
 "^":"a;OR<,G1>,Mw,Fl<,O0,kc>,I4<",
 bu:function(a){return"["+this.OR.oc+"] "+this.Mw+": "+this.G1},
 $isHV:true,
 static:{"^":"Y1"}}}],["","main.dart",,F,{
 "^":"",
-V3:[function(){N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.T7())
+E2:function(){var z,y
+N.QM("").sOR(C.IF)
+N.QM("").gSZ().yI(new F.e377())
 N.QM("").To("Starting Observatory")
-$.mC().MM.ml(new F.R0())},"$0","wV",0,0,42],
-T7:{
-"^":"Xs:115;",
+N.QM("").To("Loading Google Charts API")
+z=J.UQ($.ca(),"google")
+y=$.Ib()
+z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
+$.Ib().MM.ml(G.vN()).ml(new F.e378())},
+e377:{
+"^":"Tp:130;",
 $1:[function(a){var z
 if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
 if(J.co(z.gG1(a),"Error evaluating expression"))z=J.x5(z.gG1(a),"Can't assign to null: ")===!0||J.x5(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,114,"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,129,"call"],
 $isEH:true},
-R0:{
-"^":"Xs:10;",
-$1:[function(a){var z,y
-N.QM("").To("Loading Google Charts API")
-z=J.UQ($.ca(),"google")
-y=$.Xr()
-z.K9("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-return $.Xr().MM.ml(G.vN()).ml(new F.zp())},"$1",null,2,0,null,11,"call"],
-$isEH:true},
-zp:{
-"^":"Xs:10;",
-$1:[function(a){N.QM("").To("Polymer Ready.")},"$1",null,2,0,null,11,"call"],
+e378:{
+"^":"Tp:10;",
+$1:[function(a){N.QM("").To("Initializing Polymer")
+A.YK()},"$1",null,2,0,null,11,"call"],
 $isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 md:{
-"^":"V21;i4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V30;i4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
-static:{aD:function(a){var z,y,x,w
-z=$.J1()
+static:{DCi:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10686,19 +11253,19 @@
 C.kD.ZL(a)
 C.kD.XI(a)
 return a}}},
-V21:{
+V30:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V22;KU,V4,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V31;KU,V4,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
 sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{AJ:function(a){var z,y,x,w
-z=$.J1()
+static:{yU:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10712,17 +11279,17 @@
 C.SU.ZL(a)
 C.SU.XI(a)
 return a}}},
-V22:{
+V31:{
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V23;KU,V4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V32;KU,V4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
 sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
 static:{JR:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10735,31 +11302,31 @@
 C.nn.ZL(a)
 C.nn.XI(a)
 return a}}},
-V23:{
+V32:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V24;rU,cj,z2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V33;rU,SB,z2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gFR:function(a){return a.rU},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
 sFR:function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},
-gjl:function(a){return a.cj},
-sjl:function(a,b){a.cj=this.ct(a,C.aP,a.cj,b)},
+gjl:function(a){return a.SB},
+sjl:function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},
 gph:function(a){return a.z2},
 sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
-Ty:[function(a,b,c,d){var z=a.cj
+Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
-a.cj=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gzY",6,0,70,1,71,72],
-rT:[function(a){a.cj=this.ct(a,C.aP,a.cj,!1)},"$0","gCB",0,0,15],
+a.SB=this.ct(a,C.aP,z,!0)
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,86,1,87,88],
+rT:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,15],
 static:{ZC:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.cj=!1
+a.SB=!1
 a.z2="Refresh"
 a.on=z
 a.BA=y
@@ -10767,15 +11334,15 @@
 C.J7.ZL(a)
 C.J7.XI(a)
 return a}}},
-V24:{
+V33:{
 "^":"uL+Pi;",
 $isd3:true},
 G1:{
-"^":"V25;Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V34;Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{J8:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10787,22 +11354,22 @@
 C.lx.ZL(a)
 C.lx.XI(a)
 return a}}},
-V25:{
+V34:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V26;Jo,iy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V35;Jo,iy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-Wt:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,17,35],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,17,54],
 gu6:function(a){var z=a.iy
 if(z!=null)return z.gHP()
 else return""},
 su6:function(a,b){},
-static:{Du:function(a){var z,y,x,w
-z=$.J1()
+static:{zf:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10811,20 +11378,20 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.cF.ZL(a)
-C.cF.XI(a)
+C.uF.ZL(a)
+C.uF.XI(a)
 return a}}},
-V26:{
+V35:{
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V27;VW,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V36;VW,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gHt:function(a){return a.VW},
 sHt:function(a,b){a.VW=this.ct(a,C.EV,a.VW,b)},
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{JT:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10836,17 +11403,17 @@
 C.ct.ZL(a)
 C.ct.XI(a)
 return a}}},
-V27:{
+V36:{
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V28;Au,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V37;Au,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{GO:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10855,15 +11422,15 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.z5.ZL(a)
-C.z5.XI(a)
+C.HR.ZL(a)
+C.HR.XI(a)
 return a}}},
-V28:{
+V37:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 F1:{
-"^":"V29;qC,yT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V38;qC,yT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gzj:function(a){return a.qC},
 szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
 giJ:function(a){return a.yT},
@@ -10871,18 +11438,18 @@
 q0:function(a){var z
 Z.uL.prototype.q0.call(this,a)
 if(a.qC===!0){z=new U.bl(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
-z.Lw()
+z.md()
 z.PI()
-z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
+z=new G.mL(new G.hq(null,"",null,null),z,null,null,null,null,null)
 z.hq()
 a.yT=this.ct(a,C.j2,a.yT,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
-z.Lw()
+z.md()
 z.SC()
-z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
+z=new G.mL(new G.hq(null,"",null,null),z,null,null,null,null,null)
 z.US()
 a.yT=this.ct(a,C.j2,a.yT,z)}},
 static:{Lu:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10894,7 +11461,7 @@
 C.k0.ZL(a)
 C.k0.XI(a)
 return a}}},
-V29:{
+V38:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
@@ -10904,22 +11471,22 @@
 Nz:function(a){A.dM.prototype.Nz.call(this,a)},
 I9:function(a){A.dM.prototype.I9.call(this,a)},
 wN:function(a,b,c,d){A.dM.prototype.wN.call(this,a,b,c,d)},
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,116,117],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,12,13],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,118,119],
-i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,118,119],
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,131,132],
+Ze:[function(a,b){return G.Ef(b)},"$1","gbJ",2,0,12,13],
+uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,133,134],
+i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,133,134],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,118,119],
-Qr:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,118,119],
-ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,118,119],
-fZ:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,118,119],
-xx:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,118,119],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,133,134],
+Qr:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,133,134],
+ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,133,134],
+fZ:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,133,134],
+JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,133,134],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,118,119],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,118,119],
-SG:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,118,119],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,133,134],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,133,134],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,133,134],
 static:{EE:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10927,8 +11494,8 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.Pf.ZL(a)
-C.Pf.XI(a)
+C.mk.ZL(a)
+C.mk.XI(a)
 return a}}}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
 "^":"",
 Ap:{
@@ -10945,14 +11512,14 @@
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
 k0:[function(a){},"$0","gcm",0,0,15],
 NB:[function(a){a.AP=null},"$0","gym",0,0,15],
-BN:[function(a){var z,y,x
+HC:[function(a){var z,y,x
 z=a.fn
 a.fn=null
 if(this.gnz(a)&&z!=null){y=a.AP
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,78],
+return!0}return!1},"$0","gDx",0,0,94],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -10972,29 +11539,65 @@
 bu:function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
 $isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
-N0:function(){var z,y,x,w,v,u,t,s,r,q
+wR:function(){var z,y,x,w,v,u,t,s,r,q
 if($.AM)return
-if($.Oo==null)return
+if($.iq==null)return
 $.AM=!0
 z=0
 y=null
 do{++z
 if(z===1000)y=[]
-x=$.Oo
+x=$.iq
 w=[]
 w.$builtinTypeInfo=[F.d3]
-$.Oo=w
+$.iq=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
 s=t.R9
 s=s.iE!==s
-if(s){if(t.BN(0)){if(w)y.push([u,t])
-v=!0}$.Oo.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.OD()
+if(s){if(t.HC(0)){if(w)y.push([u,t])
+v=!0}$.iq.push(t)}}}while(z<1000&&v)
+if(w&&v){w=$.eI()
 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();){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))+".")}}$.ax=$.Oo.length
-$.AM=!1}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.ax=$.iq.length
+$.AM=!1},
+Ht:function(){var z={}
+z.a=!1
+z=new O.Nq(z)
+return new P.yQ(null,null,null,null,new O.u3(z),new O.bF(z),null,null,null,null,null,null)},
+Nq:{
+"^":"Tp:135;a",
+$2:function(a,b){var z=this.a
+if(z.a)return
+z.a=!0
+a.RK(b,new O.c1(z))},
+$isEH:true},
+c1:{
+"^":"Tp:64;a",
+$0:[function(){this.a.a=!1
+O.wR()},"$0",null,0,0,null,"call"],
+$isEH:true},
+u3:{
+"^":"Tp:27;b",
+$4:[function(a,b,c,d){if(d==null)return d
+return new O.yJ(this.b,b,c,d)},"$4",null,8,0,null,24,25,26,28,"call"],
+$isEH:true},
+yJ:{
+"^":"Tp:64;c,d,e,f",
+$0:[function(){this.c.$2(this.d,this.e)
+return this.f.$0()},"$0",null,0,0,null,"call"],
+$isEH:true},
+bF:{
+"^":"Tp:136;UI",
+$4:[function(a,b,c,d){if(d==null)return d
+return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,24,25,26,28,"call"],
+$isEH:true},
+f6:{
+"^":"Tp:10;bK,Gq,Rm,w3",
+$1:[function(a){this.bK.$2(this.Gq,this.Rm)
+return this.w3.$1(a)},"$1",null,2,0,null,137,"call"],
+$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
 B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=f-e+1
@@ -11169,7 +11772,7 @@
 J.bj(o,z.Mu(z,J.Hn(J.ew(q.jr,q.dM),u.jr),u.Uj.G4.length))}u.Il=o
 u.Uj=q.Uj
 if(J.u6(q.jr,u.jr))u.jr=q.jr
-t=!1}}else if(J.u6(u.jr,q.jr)){C.Nm.aP(a,r,u);++r
+t=!1}}else if(J.u6(u.jr,q.jr)){C.Nm.xe(a,r,u);++r
 n=J.Hn(u.dM,u.Uj.G4.length)
 q.jr=J.ew(q.jr,n)
 if(typeof n!=="number")return H.s(n)
@@ -11182,7 +11785,7 @@
 Qi:function(a,b){var z,y,x,w,v,u
 if(b.length<=1)return b
 z=[]
-for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.Xk;y.G();){w=y.lo
+for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
 if(J.xC(w.gNg(),1)&&w.gRt().G4.length===1){v=w.gRt().G4
 if(0>=v.length)return H.e(v,0)
 v=v[0]
@@ -11219,8 +11822,8 @@
 d3:{
 "^":"a;",
 $isd3:true},
-ic:{
-"^":"Xs:51;a,b",
+X6:{
+"^":"Tp:67;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
 y=$.cp().jD(z,a)
@@ -11236,18 +11839,18 @@
 Sk:{
 "^":"Pi;",
 gP:function(a){return this.u1},
-sP:function(a,b){this.u1=F.Wi(this,C.YI,this.u1,b)},
+sP:function(a,b){this.u1=F.Wi(this,C.zdr,this.u1,b)},
 bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.u1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
-"^":"uFU;ID@,IO,Xk,AP,fn",
-gRT:function(){var z=this.IO
+"^":"uFU;b3@,iT,ao,AP,fn",
+gRT:function(){var z=this.iT
 if(z==null){z=P.bK(new Q.cj(this),null,!0,null)
-this.IO=z}z.toString
+this.iT=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:function(a){return this.Xk.length},
+gB:function(a){return this.ao.length},
 sB:function(a,b){var z,y,x,w,v
-z=this.Xk
+z=this.ao
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -11255,7 +11858,7 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.IO
+x=this.iT
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)if(b<y){if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
@@ -11268,63 +11871,63 @@
 x=x.br(0)
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.b4(new G.DA(this,w,x,b,0))}else{v=[]
+this.iH(new G.DA(this,w,x,b,0))}else{v=[]
 x=new P.Yp(v)
 x.$builtinTypeInfo=[null]
-this.b4(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.Xk
+this.iH(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
+t:function(a,b){var z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){var z,y,x,w
-z=this.Xk
+z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.IO
+x=this.iT
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x){x=[y]
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.b4(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
+this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},
 gl0:function(a){return P.lD.prototype.gl0.call(this,this)},
 gor:function(a){return P.lD.prototype.gor.call(this,this)},
-Mh:function(a,b,c){var z,y,x
+Yj:function(a,b,c){var z,y,x
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.IO
+z=this.iT
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.Xk
+if(z&&y>0){z=this.ao
 H.xF(z,b,y)
-this.b4(G.K6(this,b,y,H.j5(z,b,y,null).br(0)))}H.xr(this.Xk,b,c)},
+this.iH(G.K6(this,b,y,H.j5(z,b,y,null).br(0)))}H.aB(this.ao,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.Xk
+z=this.ao
 y=z.length
-this.n9(y,y+1)
-x=this.IO
+this.On(y,y+1)
+x=this.iT
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)this.b4(G.K6(this,y,1,null))
+if(x)this.iH(G.K6(this,y,1,null))
 C.Nm.h(z,b)},
 FV:function(a,b){var z,y,x,w
-z=this.Xk
+z=this.ao
 y=z.length
 C.Nm.FV(z,b)
-this.n9(y,z.length)
+this.On(y,z.length)
 x=z.length-y
-z=this.IO
+z=this.iT
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.b4(G.K6(this,y,x,null))},
+if(z&&x>0)this.iH(G.K6(this,y,x,null))},
 UZ:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
-if(!z||b>this.Xk.length)H.vh(P.TE(b,0,this.gB(this)))
+if(!z||b>this.ao.length)H.vh(P.TE(b,0,this.gB(this)))
 y=c>=b
-if(!y||c>this.Xk.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.Xk
+w=this.ao
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -11332,7 +11935,7 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.IO
+u=this.iT
 if(u!=null){t=u.iE
 u=t==null?u!=null:t!==u}else u=!1
 if(u&&x>0){if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
@@ -11345,64 +11948,64 @@
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
-this.b4(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
+this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
 UG:function(a,b,c){var z,y,x,w
-if(b<0||b>this.Xk.length)throw H.b(P.TE(b,0,this.gB(this)))
+if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.Xk
+z=this.ao
 x=z.length
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
-H.xr(z,b,c)
-this.n9(x,z.length)
-z=this.IO
+H.aB(z,b,c)
+this.On(x,z.length)
+z=this.iT
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.b4(G.K6(this,b,y,null))},
-aP:function(a,b,c){var z,y,x
-if(b>this.Xk.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.Xk
+if(z&&y>0)this.iH(G.K6(this,b,y,null))},
+xe:function(a,b,c){var z,y,x
+if(b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.ao
 y=z.length
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
 y=z.length
 H.qG(z,b+1,y,this,b)
 y=z.length
-this.n9(y-1,y)
-y=this.IO
+this.On(y-1,y)
+y=this.iT
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
-if(y)this.b4(G.K6(this,b,1,null))
+if(y)this.iH(G.K6(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
 z[b]=c},
-b4:function(a){var z,y
-z=this.IO
+iH:function(a){var z,y
+z=this.iT
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
-if(this.ID==null){this.ID=[]
-P.rb(this.gL6())}this.ID.push(a)},
-n9:function(a,b){var z,y
+if(this.b3==null){this.b3=[]
+P.rb(this.gL6())}this.b3.push(a)},
+On:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=b===0
 this.ct(this,C.ai,z,y)
 this.ct(this,C.nZ,!z,!y)},
 Lu:[function(){var z,y,x
-z=this.ID
+z=this.b3
 if(z==null)return!1
 y=G.Qi(this,z)
-this.ID=null
-z=this.IO
+this.b3=null
+z=this.iT
 if(z!=null){x=z.iE
 x=x==null?z!=null:x!==z}else x=!1
 if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,78],
+return!0}return!1},"$0","gL6",0,0,94],
 $iswn:true,
 static:{ch:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -11439,8 +12042,8 @@
 "^":"rm+Pi;",
 $isd3:true},
 cj:{
-"^":"Xs:42;a",
-$0:function(){this.a.IO=null},
+"^":"Tp:64;a",
+$0:function(){this.a.iT=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
 ya:{
@@ -11487,7 +12090,7 @@
 this.G8()}z.V1(0)},
 aN:function(a,b){return this.Zp.aN(0,b)},
 bu:function(a){return P.vW(this)},
-G8:function(){this.nq(this,H.VM(new T.qI(this,C.Yy,null,null),[null]))
+G8:function(){this.nq(this,H.VM(new T.qI(this,C.SV,null,null),[null]))
 this.nq(this,H.VM(new T.qI(this,C.Yn,null,null),[null]))},
 $isqC:true,
 $isZ0:true,
@@ -11496,38 +12099,38 @@
 else z=!!a.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.YM(null,null,null,b,c),null,null),[b,c])
 return z}}},
 zT:{
-"^":"Xs;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,52,18,"call"],
+"^":"Tp;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,68,18,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"H7",args:[a,b]}},this.a,"qC")}},
+$signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Xs:51;a",
+"^":"Tp:67;a",
 $2:function(a,b){var z=this.a
 z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
 $isEH:true}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
 "^":"",
-cc:{
-"^":"Ap;fq,Pc,WS,Vq,qU",
+Qw:{
+"^":"Ap;fq,Pc,cl,Vq,dS",
 QI:function(a){return this.Pc.$1(a)},
 EO:function(a){return this.Vq.$1(a)},
 TR:function(a,b){var z
 this.Vq=b
 z=this.QI(J.mu(this.fq,this.gv7()))
-this.qU=z
+this.dS=z
 return z},
 jA:[function(a){var z=this.QI(a)
-if(J.xC(z,this.qU))return
-this.qU=z
-return this.EO(z)},"$1","gv7",2,0,10,36],
-xO:function(a){var z=this.fq
-if(z!=null)J.yd(z)
+if(J.xC(z,this.dS))return
+this.dS=z
+return this.EO(z)},"$1","gv7",2,0,10,55],
+S6:function(a){var z=this.fq
+if(z!=null)J.x0(z)
 this.fq=null
 this.Pc=null
-this.WS=null
+this.cl=null
 this.Vq=null
-this.qU=null},
+this.dS=null},
 gP:function(a){var z=this.QI(J.Vm(this.fq))
-this.qU=z
+this.dS=z
 return z},
 sP:function(a,b){J.Fc(this.fq,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
@@ -11538,16 +12141,16 @@
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
-z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
-if(z)return J.UQ(a,$.b7().eB.t(0,b))
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
+if(z)return J.UQ(a,$.b7().ep.t(0,b))
 try{z=a
 y=b
-x=$.cp().Gu.t(0,y)
+x=$.cp().eA.t(0,y)
 if(x==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+H.d(z)))
 z=x.$1(z)
-return z}catch(w){if(!!J.x(H.Ru(w)).$ismp){z=J.bB(a)
-v=$.yQ().Qk(z,C.OV)
-if(!(v!=null&&v.fY===C.it&&!v.Fo))throw w}else throw w}}z=$.Ku()
+return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.bB(a)
+v=$.mX().F1(z,C.OV)
+if(!(v!=null&&v.fY===C.it&&!v.Fo))throw w}else throw w}}z=$.T5()
 if(z.Im(C.Ab))z.x9("can't get "+H.d(b)+" in "+H.d(a))
 return},
 iu:function(a,b,c){var z,y,x
@@ -11558,11 +12161,11 @@
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
-z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
-if(z){J.kW(a,$.b7().eB.t(0,b),c)
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
+if(z){J.kW(a,$.b7().ep.t(0,b),c)
 return!0}try{$.cp().Cq(a,b,c)
-return!0}catch(x){if(!!J.x(H.Ru(x)).$ismp){z=J.bB(a)
-if(!$.yQ().UK(z,C.OV))throw x}else throw x}}z=$.Ku()
+return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.bB(a)
+if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.T5()
 if(z.Im(C.Ab))z.x9("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 cB:function(a){a=J.rr(a)
@@ -11571,49 +12174,49 @@
 if(a[0]===".")return!1
 return $.tN().zD(a)},
 WR:{
-"^":"AR;I3,pn,LG,jR,xX,jB,Hy",
-gEQ:function(){return this.I3==null},
-sP:function(a,b){var z=this.I3
-if(z!=null)z.rL(this.pn,b)},
-gX6:function(){return 2},
+"^":"AR;yc,XF,xE,Fs,GX,W8,Wf",
+gqc:function(){return this.yc==null},
+sP:function(a,b){var z=this.yc
+if(z!=null)z.rL(this.XF,b)},
+gFH:function(){return 2},
 TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
-BB:function(){this.LG=L.SE(this,this.pn)
-this.Oq(!0)},
-fV:function(){this.Hy=null
-this.I3=null
-this.pn=null},
-GA:function(a){this.I3.kJ(this.pn,a)},
-Oq:function(a){var z,y
-z=this.Hy
-y=this.I3.Tl(this.pn)
-this.Hy=y
+NJ:function(){this.xE=L.SE(this,this.XF)
+this.hQ(!0)},
+kH:function(){this.Wf=null
+this.yc=null
+this.XF=null},
+nf:function(a){this.yc.VV(this.XF,a)},
+hQ:function(a){var z,y
+z=this.Wf
+y=this.yc.Tl(this.XF)
+this.Wf=y
 if(a||J.xC(y,z))return!1
-this.WP(this.Hy,z)
+this.zc(this.Wf,z)
 return!0},
-Pz:function(){return this.Oq(!1)},
+lI:function(){return this.hQ(!1)},
 $isAp:true},
 Tv:{
-"^":"a;Ih",
-gB:function(a){return this.Ih.length},
-gl0:function(a){return this.Ih.length===0},
+"^":"a;Ld",
+gB:function(a){return this.Ld.length},
+gl0:function(a){return this.Ld.length===0},
 gPu:function(){return!0},
 bu:function(a){if(!this.gPu())return"<invalid path>"
-return H.VM(new H.lJ(this.Ih,new L.f7()),[null,null]).zV(0,".")},
+return H.VM(new H.lJ(this.Ld,new L.f7()),[null,null]).zV(0,".")},
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isTv)return!1
 if(this.gPu()!==b.gPu())return!1
-z=this.Ih
+z=this.Ld
 y=z.length
-x=b.Ih
+x=b.Ld
 if(y!==x.length)return!1
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=z[w]
 if(w>=x.length)return H.e(x,w)
 if(!J.xC(v,x[w]))return!1}return!0},
 giO:function(a){var z,y,x,w,v
-for(z=this.Ih,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
+for(z=this.Ld,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=J.v1(z[w])
 if(typeof v!=="number")return H.s(v)
 x=536870911&x+v
@@ -11623,20 +12226,20 @@
 return 536870911&x+((16383&x)<<15>>>0)},
 Tl:function(a){var z,y
 if(!this.gPu())return
-for(z=this.Ih,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+for(z=this.Ld,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 if(a==null)return
 a=L.yf(a,y)}return a},
 rL:function(a,b){var z,y,x
-z=this.Ih
+z=this.Ld
 y=z.length-1
 if(y<0)return!1
 for(x=0;x<y;++x){if(a==null)return!1
 if(x>=z.length)return H.e(z,x)
 a=L.yf(a,z[x])}if(y>=z.length)return H.e(z,y)
 return L.iu(a,z[y],b)},
-kJ:function(a,b){var z,y,x,w
-if(!this.gPu()||this.Ih.length===0)return
-z=this.Ih
+VV:function(a,b){var z,y,x,w
+if(!this.gPu()||this.Ld.length===0)return
+z=this.Ld
 y=z.length-1
 for(x=0;a!=null;x=w){b.$1(a)
 if(x>=y)break
@@ -11660,7 +12263,7 @@
 for(;u.G();){x=u.lo
 if(J.xC(x,""))continue
 t=H.BU(x,10,new L.oq())
-v.push(t!=null?t:$.b7().d8.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
+v.push(t!=null?t:$.b7().I1.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
 y=$.fX()
 if(y.X5>=100){y.toString
 u=new P.i5(y)
@@ -11670,162 +12273,162 @@
 y.Rz(0,s.gl())}y.u(0,a,w)
 return w}}},
 oq:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return},
 $isEH:true},
 f7:{
-"^":"Xs:10;",
-$1:[function(a){return!!J.x(a).$isIN?$.b7().eB.t(0,a):a},"$1",null,2,0,null,120,"call"],
+"^":"Tp:10;",
+$1:[function(a){return!!J.x(a).$isIN?$.b7().ep.t(0,a):a},"$1",null,2,0,null,138,"call"],
 $isEH:true},
-ov:{
-"^":"Tv;Ih",
+Ul:{
+"^":"Tv;Ld",
 gPu:function(){return!1},
 static:{"^":"qr"}},
 MdQ:{
-"^":"Xs:42;",
+"^":"Tp:64;",
 $0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.ol("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true},
 NV:{
-"^":"AR;LG,Bg,jR,xX,jB,Hy",
-gEQ:function(){return this.Bg==null},
-gX6:function(){return 3},
+"^":"AR;xE,TV,Fs,GX,W8,Wf",
+gqc:function(){return this.TV==null},
+gFH:function(){return 3},
 TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
-BB:function(){var z,y,x,w
-this.Oq(!0)
-for(z=this.Bg,y=z.length,x=0;x<y;x+=2){w=z[x]
+NJ:function(){var z,y,x,w
+this.hQ(!0)
+for(z=this.TV,y=z.length,x=0;x<y;x+=2){w=z[x]
 if(w!==C.dV){z=$.xG
-if(z!=null){y=z.zT
+if(z!=null){y=z.kT
 y=y==null?w!=null:y!==w}else y=!0
 if(y){z=new L.zG(w,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.R3.u(0,this.jR,this)
-this.GA(z.gTT())
-this.LG=null
+$.xG=z}z.Nl.u(0,this.Fs,this)
+this.nf(z.gTT())
+this.xE=null
 break}}},
-fV:function(){var z,y,x,w
-this.Hy=null
-for(z=0;y=this.Bg,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
+kH:function(){var z,y,x,w
+this.Wf=null
+for(z=0;y=this.TV,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
 if(w>=x)return H.e(y,w)
-J.yd(y[w])}this.Bg=null},
+J.x0(y[w])}this.TV=null},
 yN:function(a,b){var z
-if(this.xX!=null||this.Bg==null)throw H.b(P.w("Cannot add paths once started."))
+if(this.GX!=null||this.TV==null)throw H.b(P.w("Cannot add paths once started."))
 if(!J.x(b).$isTv)b=L.hk(b)
-z=this.Bg
+z=this.TV
 z.push(a)
 z.push(b)},
 ti:function(a){return this.yN(a,null)},
-GA:function(a){var z,y,x,w,v
-for(z=0;y=this.Bg,x=y.length,z<x;z+=2){w=y[z]
+nf:function(a){var z,y,x,w,v
+for(z=0;y=this.TV,x=y.length,z<x;z+=2){w=y[z]
 if(w!==C.dV){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isTv").kJ(w,a)}}},
-Oq:function(a){var z,y,x,w,v,u,t,s,r
-J.Vw(this.Hy,C.jn.cU(this.Bg.length,2))
-for(z=!1,y=null,x=0;w=this.Bg,v=w.length,x<v;x+=2){u=x+1
+H.Go(y[v],"$isTv").VV(w,a)}}},
+hQ:function(a){var z,y,x,w,v,u,t,s,r
+J.Vw(this.Wf,C.jn.cU(this.TV.length,2))
+for(z=!1,y=null,x=0;w=this.TV,v=w.length,x<v;x+=2){u=x+1
 if(u>=v)return H.e(w,u)
 t=w[u]
 s=w[x]
 if(s===C.dV){H.Go(t,"$isAp")
 r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
-if(a){J.kW(this.Hy,C.jn.cU(x,2),r)
-continue}w=this.Hy
+if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
+continue}w=this.Wf
 v=C.jn.cU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
-w=this.jB
+w=this.W8
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.Hy,v))}J.kW(this.Hy,v,r)
+y.u(0,v,J.UQ(this.Wf,v))}J.kW(this.Wf,v,r)
 z=!0}if(!z)return!1
-this.JQ(this.Hy,y,w)
+this.Aw(this.Wf,y,w)
 return!0},
-Pz:function(){return this.Oq(!1)},
+lI:function(){return this.hQ(!1)},
 $isAp:true},
 iNc:{
 "^":"a;"},
 AR:{
-"^":"Ap;jR<",
-d9:function(){return this.xX.$0()},
-hM:function(a){return this.xX.$1(a)},
-Lt:function(a,b){return this.xX.$2(a,b)},
-bO:function(a,b,c){return this.xX.$3(a,b,c)},
-gcF:function(){return this.xX!=null},
-TR:function(a,b){if(this.xX!=null||this.gEQ())throw H.b(P.w("Observer has already been opened."))
-if(X.Lx(b)>this.gX6())throw H.b(P.u("callback should take "+this.gX6()+" or fewer arguments"))
-this.xX=b
-this.jB=P.J(this.gX6(),X.aW(b))
-this.BB()
-return this.Hy},
-gP:function(a){this.Oq(!0)
-return this.Hy},
-xO:function(a){if(this.xX==null)return
-this.fV()
-this.Hy=null
-this.xX=null},
-di:[function(a){if(this.xX!=null)this.Fe()},"$1","gQ8",2,0,17,11],
-Fe:function(){var z=0
-while(!0){if(!(z<1000&&this.Pz()))break;++z}return z>0},
-JQ:function(a,b,c){var z,y,x,w
-try{switch(this.jB){case 0:this.d9()
+"^":"Ap;Fs<",
+TI:function(){return this.GX.$0()},
+K0:function(a){return this.GX.$1(a)},
+tH:function(a,b){return this.GX.$2(a,b)},
+Mm:function(a,b,c){return this.GX.$3(a,b,c)},
+gL9:function(){return this.GX!=null},
+TR:function(a,b){if(this.GX!=null||this.gqc())throw H.b(P.w("Observer has already been opened."))
+if(X.OS(b)>this.gFH())throw H.b(P.u("callback should take "+this.gFH()+" or fewer arguments"))
+this.GX=b
+this.W8=P.J(this.gFH(),X.Zpg(b))
+this.NJ()
+return this.Wf},
+gP:function(a){this.hQ(!0)
+return this.Wf},
+S6:function(a){if(this.GX==null)return
+this.kH()
+this.Wf=null
+this.GX=null},
+xV:[function(a){if(this.GX!=null)this.SG()},"$1","gjM",2,0,17,11],
+SG:function(){var z=0
+while(!0){if(!(z<1000&&this.lI()))break;++z}return z>0},
+Aw:function(a,b,c){var z,y,x,w
+try{switch(this.W8){case 0:this.TI()
 break
-case 1:this.hM(a)
+case 1:this.K0(a)
 break
-case 2:this.Lt(a,b)
+case 2:this.tH(a,b)
 break
-case 3:this.bO(a,b,c)
+case 3:this.Mm(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
+y=new H.XO(x,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}},
-WP:function(a,b){return this.JQ(a,b,null)}},
+zc:function(a,b){return this.Aw(a,b,null)}},
 zG:{
-"^":"a;zT,R3,ZY,bl,bV",
-TR:function(a,b){this.R3.u(0,b.gjR(),b)
-b.GA(this.gTT())},
-wE:[function(a){var z=J.x(a)
-if(!!z.$iswn)this.Uq(a.gRT())
-if(!!z.$isd3)this.Uq(z.gqh(a))},"$1","gTT",2,0,121],
-Uq:function(a){var z,y
-if(this.ZY==null)this.ZY=P.YM(null,null,null,null,null)
-z=this.bl
+"^":"a;kT,Nl,rS,HN,op",
+TR:function(a,b){this.Nl.u(0,b.gFs(),b)
+b.nf(this.gTT())},
+we:[function(a){var z=J.x(a)
+if(!!z.$iswn)this.c1(a.gRT())
+if(!!z.$isd3)this.c1(z.gqh(a))},"$1","gTT",2,0,139],
+c1:function(a){var z,y
+if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
+z=this.HN
 y=z!=null?z.Rz(0,a):null
-if(y!=null)this.ZY.u(0,a,y)
-else if(!this.ZY.x4(a))this.ZY.u(0,a,a.yI(this.gp7()))},
+if(y!=null)this.rS.u(0,a,y)
+else if(!this.rS.x4(a))this.rS.u(0,a,a.yI(this.gCP()))},
 CH:[function(a){var z,y,x,w,v
-if(!this.bV)return
-z=this.bl
+if(!this.op)return
+z=this.HN
 if(z==null)z=P.YM(null,null,null,null,null)
-this.bl=this.ZY
-this.ZY=z
-for(y=this.R3,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.qv]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
-if(v.gcF())v.GA(this.gTT())}for(y=this.bl,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
-this.bl=null},"$0","gSI",0,0,15],
-Hi:[function(a){var z,y
-for(z=this.R3,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(y.gcF())y.Pz()}this.bV=!0
-P.rb(this.gSI(this))},"$1","gp7",2,0,17,122],
+this.HN=this.rS
+this.rS=z
+for(y=this.Nl,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.qv]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
+if(v.gL9())v.nf(this.gTT())}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
+this.HN=null},"$0","gSI",0,0,15],
+KO:[function(a){var z,y
+for(z=this.Nl,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(y.gL9())y.lI()}this.op=!0
+P.rb(this.gSI(this))},"$1","gCP",2,0,17,140],
 static:{"^":"xG",SE:function(a,b){var z,y
 z=$.xG
-if(z!=null){y=z.zT
+if(z!=null){y=z.kT
 y=y==null?b!=null:y!==b}else y=!0
 if(y){z=new L.zG(b,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.R3.u(0,a.jR,a)
-a.GA(z.gTT())}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
+$.xG=z}z.Nl.u(0,a.Fs,a)
+a.nf(z.gTT())}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
 tB:[function(a){var z,y,x
 z=J.x(a)
 if(!!z.$isd3)return a
 if(!!z.$isZ0){y=V.AB(a,null,null)
 z.aN(a,new R.Fk(y))
-return y}if(!!z.$iscX){z=z.ez(a,R.Ft())
+return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
 x=Q.ch(null,null)
 x.FV(0,z)
 return x}return a},"$1","Ft",2,0,10,18],
 Fk:{
-"^":"Xs:51;a",
+"^":"Tp:67;a",
 $2:function(a,b){this.a.u(0,R.tB(a),R.tB(b))},
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
-oF:function(a,b){var z,y,x
-for(z=$.yQ().Me(0,a,C.YV),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+Jy:function(a,b){var z,y,x
+for(z=$.mX().Me(0,a,C.Hh),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
 if(b==null)b=P.Fl(null,null)
@@ -11836,34 +12439,34 @@
 if(z==null)return
 y=J.UQ(z,"ShadowCSS")
 if(y==null)return
-y.K9("shimStyling",[a,b,c])},
+y.V7("shimStyling",[a,b,c])},
 Hl:function(a){var z,y,x,w,v
 if(a==null)return""
-if($.ok)return""
+if($.UG)return""
 w=J.RE(a)
 z=w.gmH(a)
 if(J.xC(z,""))z=w.gQg(a).MW.getAttribute("href")
 try{w=new XMLHttpRequest()
-C.W3.eo(w,"GET",z,!1)
+C.W3.kP(w,"GET",z,!1)
 w.send()
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
-if(!!J.x(w).$isNh){y=w
-x=new H.oP(v,null)
-$.Es().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+if(!!J.x(w).$isBK){y=w
+x=new H.XO(v,null)
+$.Es().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
 fS:[function(a){var z,y
-z=$.b7().eB.t(0,a)
+z=$.b7().ep.t(0,a)
 if(z==null)return!1
 y=J.rY(z)
-return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","NL",2,0,43,44],
+return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","NL",2,0,59,60],
 Ad:function(a,b){$.Ej().u(0,a,b)
 H.Go(J.UQ($.ca(),"Polymer"),"$isr7").PO([a])},
-xv:function(a){A.Cm(a,new A.YC())},
-Cm:function(a,b){var z
+xv:function(a){A.VxC(a,new A.Sv())},
+VxC:function(a,b){var z
 if(a==null)return
 b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.Cm(z,b)},
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.VxC(z,b)},
 pf:function(a,b,c){return new A.L6(a,b)},
 h6:function(a,b){var z,y
 if(a==null)return
@@ -11872,15 +12475,21 @@
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
 b.appendChild(z)},
+YK:function(){if($.UG){A.X1($.M6,!0)
+return $.X3}var z=$.X3.qp(O.Ht())
+z.Gr(new A.mS())
+return z},
 X1:function(a,b){var z
+if($.AC)throw H.b("Initialization was already done.")
+$.AC=!0
 A.JP()
 $.ok=b
-for(z=H.VM(new H.a7(a,58,0,null),[H.Kp(a,0)]);z.G();)z.lo.$0()},
+for(a.length,z=H.VM(new H.a7(a,72,0,null),[H.Kp(a,0)]);z.G();)z.lo.$0()},
 JP:function(){var z,y,x,w,v
 z=J.UQ($.ca(),"Polymer")
 if(z==null)throw H.b(P.w("polymer.js must be loaded before polymer.dart, please add <link rel=\"import\" href=\"packages/polymer/polymer.html\"> to your <head> before any Dart scripts. Alternatively you can get a different version of polymer.js by following the instructions at http://www.polymer-project.org; if you do that be sure to include the platform polyfills."))
 y=$.X3
-z.K9("whenPolymerReady",[y.ce(new A.hp())])
+z.V7("whenPolymerReady",[y.ce(new A.hp())])
 x=J.UQ(P.Oe(document.createElement("polymer-element",null)),"__proto__")
 if(!!J.x(x).$isKV)x=P.Oe(x)
 w=J.U6(x)
@@ -11888,9 +12497,9 @@
 if(v==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
 w.u(x,"register",P.mt(new A.k2(y,v)))},
 XP:{
-"^":"a;FL<,t5>,P1<,oc>,Q7<,NF<,iK<,kK<,of,lD,PS<,Ve",
+"^":"a;FL<,t5>,P1<,oc>,Q7<,NF<,iK<,kK<,Qk,lD,PS<,Ve",
 gZf:function(){var z,y
-z=J.c1(this.FL,"template")
+z=J.Eh(this.FL,"template")
 if(z!=null)y=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
 else y=null
 return y},
@@ -11899,25 +12508,25 @@
 if(z==null)return
 for(y=J.MK(z,"shadow"),y=y.gA(y);y.G();){x=y.lo
 w=J.RE(x)
-if(J.FN(w.gUN(x)))w.mx(x,document.createElement("content",null))}}},
+if(J.tx(w.gUN(x)))w.mx(x,document.createElement("content",null))}}},
 Ba:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 for(z=null,y=this;y!=null;){z=J.Vs(y.gFL()).MW.getAttribute("extends")
 y=y.gP1()}x=document
 w=this.t5
 v=window
-u=J.Dc(w)
+u=J.Xr(w)
 if(u==null)H.vh(P.u(w))
 t=u.prototype
-s=J.Nq(w,"created")
+s=J.YC(w,"created")
 if(s==null)H.vh(P.u(H.d(w)+" has no constructor called 'created'"))
-J.M3(W.r3("article",null))
+J.m0(W.r3("article",null))
 r=u.$nativeSuperclassTag
 if(r==null)H.vh(P.u(w))
 w=z==null
 if(w){if(!J.xC(r,"HTMLElement"))H.vh(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(x.createElement(z) instanceof window[r]))H.vh(P.f("extendsTag does not match base native class"))
 q=v[r]
 p={}
-p.createdCallback={value:function(b){return function(){return b(this)}}(H.tR(W.v8(s,t),1))}
+p.createdCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Xw(s,t),1))}
 p.attachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.B4(),1))}
 p.detachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Z6(),1))}
 p.attributeChangedCallback={value:function(b){return function(c,d,e){return b(this,c,d,e)}}(H.tR(W.A6(),4))}
@@ -11932,15 +12541,15 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 this.Q7=y}z=this.t5
-this.Q7=A.oF(z,this.Q7)
+this.Q7=A.Jy(z,this.Q7)
 x=J.Vs(this.FL).MW.getAttribute("attributes")
 if(x!=null)for(y=C.xB.Fr(x,$.zZ()),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
 if(v==="")continue
-u=$.b7().d8.t(0,v)
+u=$.b7().I1.t(0,v)
 t=L.hk([u])
 s=this.Q7
 if(s!=null&&s.x4(t))continue
-r=$.yQ().CV(z,u)
+r=$.mX().CV(z,u)
 if(r==null||r.fY===C.it||r.V5){window
 s="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
 if(typeof console!="undefined")console.warn(s)
@@ -11952,16 +12561,16 @@
 this.kK=z
 y=this.P1
 if(y!=null)z.FV(0,y.gkK())
-J.Vs(this.FL).aN(0,new A.HO(this))},
+J.Vs(this.FL).aN(0,new A.eY(this))},
 W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
-Mi:function(){var z=this.Hs("[rel=stylesheet]")
-this.of=z
+Mi:function(){var z=this.Bg("[rel=stylesheet]")
+this.Qk=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
-f6:function(){var z=this.Hs("style[polymer-scope]")
+f6:function(){var z=this.Bg("style[polymer-scope]")
 this.lD=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
-OL:function(){var z,y,x,w,v,u,t
-z=this.of
+m1:function(){var z,y,x,w,v,u,t
+z=this.Qk
 z.toString
 y=H.VM(new H.U5(z,new A.ZG()),[null])
 x=this.gZf()
@@ -11971,18 +12580,18 @@
 w.vM=t+"\n"}if(w.vM.length>0){z=document.createElement("style",null)
 J.t3(z,H.d(w))
 v=J.RE(x)
-v.FO(x,z,v.gPZ(x))}}},
+v.mK(x,z,v.gPZ(x))}}},
 Wz:function(a,b){var z,y,x
 z=J.MK(this.FL,a)
 y=z.br(z)
 x=this.gZf()
 if(x!=null)C.Nm.FV(y,J.MK(x,a))
 return y},
-Hs:function(a){return this.Wz(a,null)},
+Bg:function(a){return this.Wz(a,null)},
 kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.ua("[polymer-scope="+a+"]")
-for(x=this.of,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.SO(J.mY(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.Hl(w.gl())
+for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.SO(J.mY(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.Hl(w.gl())
 u=z.vM+=typeof v==="string"?v:H.d(v)
 z.vM=u+"\n\n"}for(x=this.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.mY(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
 w=z.vM+=typeof v==="string"?v:H.d(v)
@@ -11994,29 +12603,29 @@
 z.setAttribute("element",H.d(this.oc)+"-"+b)
 return z},
 rH:function(){var z,y,x,w,v
-for(z=$.HN(),z=$.yQ().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+for(z=$.HN(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 if(this.iK==null)this.iK=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
-v=$.b7().eB.t(0,w)
+v=$.b7().ep.t(0,w)
 w=J.U6(v)
 v=w.Nj(v,0,J.Hn(w.gB(v),7))
 this.iK.u(0,L.hk(v),[x.goc(y)])}},
 I7:function(){var z,y,x
-for(z=$.yQ().Me(0,this.t5,C.Xk),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo.gDv()
+for(z=$.mX().Me(0,this.t5,C.Xk),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo.gDv()
 x=new H.a7(y,y.length,0,null)
 x.$builtinTypeInfo=[H.Kp(y,0)]
 for(;x.G();)continue}},
 Yl:function(a){var z=P.L5(null,null,null,P.qU,null)
-a.aN(0,new A.MX(z))
+a.aN(0,new A.Tj(z))
 return z},
 $isXP:true},
-HO:{
-"^":"Xs:51;a",
+eY:{
+"^":"Tp:67;a",
 $2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
 $isEH:true},
 BO:{
-"^":"Xs:51;a",
+"^":"Tp:67;a",
 $2:function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
@@ -12024,32 +12633,32 @@
 if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
 $isEH:true},
 ZG:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
 ua:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){return J.RF(a,this.a)},
 $isEH:true},
 ix:{
-"^":"Xs:42;",
+"^":"Tp:64;",
 $0:function(){return[]},
 $isEH:true},
-MX:{
-"^":"Xs:123;a",
+Tj:{
+"^":"Tp:141;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 DOe:{
-"^":"Xs:42;",
+"^":"Tp:64;",
 $0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
-C.SP.aN(0,new A.LfS(z))
+C.SP.aN(0,new A.xb(z))
 return z},
 $isEH:true},
-LfS:{
-"^":"Xs:51;a",
+xb:{
+"^":"Tp:67;a",
 $2:function(a,b){this.a.u(0,b,a)},
 $isEH:true},
-yL:{
+A2:{
 "^":"ndx;"},
 dM:{
 "^":"a;",
@@ -12062,7 +12671,7 @@
 y=z==null||z===""?this.gqn(a):z
 a.a6=$.RA().t(0,y)
 this.Xl(a)
-this.oR(a)
+this.Z2(a)
 this.fk(a)
 this.Uc(a)
 $.Bh=$.Bh+1
@@ -12078,14 +12687,14 @@
 aI:function(a,b){var z,y,x,w
 z=J.RE(b)
 y=z.Wk(b,"template")
-if(y!=null)if(J.Vs(a.a6.gFL()).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
+if(y!=null)if(J.Vs(a.a6.gFL()).MW.hasAttribute("lightdom")===!0){this.kD(a,y)
 x=null}else x=this.TH(a,y)
 else x=null
 if(!J.x(x).$isI0)return
 w=z.gQg(b).MW.getAttribute("name")
 if(w==null)return
 a.BA.u(0,w,x)},
-Se:function(a,b){var z,y
+kD:function(a,b){var z,y
 if(b==null)return
 z=!!J.x(b).$isvy?b:M.Ky(b)
 y=z.ZK(a,a.on)
@@ -12108,7 +12717,7 @@
 y.u(0,J.F8(x),x)}},
 wN:function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
-oR:function(a){a.a6.gkK().aN(0,new A.Sv(a))},
+Z2:function(a){a.a6.gkK().aN(0,new A.dZ(a))},
 fk:function(a){if(a.a6.gNF()==null)return
 this.gQg(a).aN(0,this.ghW(a))},
 D3:[function(a,b,c){var z,y,x,w,v,u
@@ -12122,7 +12731,7 @@
 x=J.x(v)
 u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.HH))&&w!=null?J.bB(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,124],
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,142],
 B2:function(a,b){var z=a.a6.gNF()
 if(z==null)return
 return z.t(0,b)},
@@ -12140,11 +12749,11 @@
 if(a.a6==null)this.es(a)
 z=this.B2(a,b)
 if(z==null)return J.FS(M.Ky(a),b,c,d)
-else{J.SB(M.Ky(a),b)
+else{J.n1(M.Ky(a),b)
 y=J.RE(z)
 x=y.goc(z)
-w=$.ZH()
-if(w.Im(C.eI))w.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gqn(a))+"].[name]")
+w=$.zB()
+if(w.Im(C.t4))w.J4("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gqn(a))+"].[name]")
 w=J.RE(c)
 if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
 v=new A.Bf(a,x,c,null,null)
@@ -12156,10 +12765,10 @@
 J.kW(J.QE(M.Ky(a)),b,v)
 return v}},
 gCd:function(a){return J.QE(M.Ky(a))},
-Yj:function(a,b){return J.SB(M.Ky(a),b)},
+Mh:function(a,b){return J.n1(M.Ky(a),b)},
 x3:function(a){var z,y
 if(a.q9===!0)return
-$.RI().Ny("["+H.d(this.gqn(a))+"] asyncUnbindAll")
+$.EM().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
 z=a.YE
 y=this.gJg(a)
 if(z!=null)z.TP(0)
@@ -12167,22 +12776,22 @@
 z.jd=y
 z.ih=P.ww(C.ny,z.gv6(z))
 a.YE=z},
-GB:[function(a){var z,y
+BM:[function(a){var z,y
 if(a.q9===!0)return
 z=a.JB
-if(z!=null){z.xO(0)
+if(z!=null){z.S6(0)
 a.JB=null}this.C0(a)
-J.D9(M.Ky(a))
+J.DB(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
 y=y.olderShadowRoot}a.q9=!0},"$0","gJg",0,0,15],
 dH:function(a,b){var z
-if(a.q9===!0){$.RI().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
-return}$.RI().Ny("["+H.d(this.gqn(a))+"] cancelUnbindAll")
+if(a.q9===!0){$.EM().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
+return}$.EM().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.YE
 if(z!=null){z.TP(0)
 a.YE=null}if(b===!0)return
-A.Cm(this.gIW(a),new A.TV())},
+A.VxC(this.gIW(a),new A.TV())},
 oW:function(a){return this.dH(a,null)},
 Xl:function(a){var z,y,x,w,v,u,t
 z=a.a6.giK()
@@ -12192,28 +12801,27 @@
 if(!x||y!=null){x=$.ps
 $.ps=x+1
 v=new L.NV(null,[],x,null,null,null)
-v.Hy=[]
+v.Wf=[]
 a.JB=v
 if(w)for(x=H.VM(new P.fG(z),[H.Kp(z,0)]),u=x.Fb,x=H.VM(new P.EQ(u,u.Ig(),0,null),[H.Kp(x,0)]);x.G();){t=x.fD
 v.yN(a,t)
 this.rJ(a,t,t.Tl(a),null)}if(y!=null)for(x=y.gvc(),u=x.Fb,x=H.VM(new P.N6(u,u.zN,null,null),[H.Kp(x,0)]),x.zq=x.Fb.H9;x.G();){t=x.fD
 if(!w||!z.x4(t))v.yN(a,t)}L.AR.prototype.TR.call(v,v,this.gnu(a))}},
-FQ:[function(a,b,c,d){J.kH(c,new A.n1(a,b,c,d,a.a6.giK(),a.a6.gQ7(),P.op(null,null,null,null)))},"$3","gnu",6,0,125],
+FQ:[function(a,b,c,d){J.kH(c,new A.qz(a,b,c,d,a.a6.giK(),a.a6.gQ7(),P.op(null,null,null,null)))},"$3","gnu",6,0,143],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=a.a6.giK()
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
 if(!!J.x(d).$iswn){x=$.dn()
-if(x.Im(C.eI))x.Ny("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
+if(x.Im(C.t4))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
 this.l5(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.dn()
-if(x.Im(C.eI))x.Ny("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
+if(x.Im(C.t4))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gRT().w4(!1)
 x=w.Lj
-x.toString
-w.pN=new A.V1(a,d,y)
-w.o7=P.VH(P.vD(),x)
-w.Bd=P.v3()
+w.pN=x.wY(new A.V1(a,d,y))
+w.o7=P.VH(P.Mm(),x)
+w.Bd=x.Al(P.od())
 x=H.d(b)+"__array"
 v=a.nh
 if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
@@ -12231,8 +12839,8 @@
 z=a.a6.gPS()
 if(z.gl0(z))return
 y=$.Uk()
-if(y.Im(C.eI))y.Ny("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
-this.UH(a,a,z.gvc(),this.gay(a))},
+if(y.Im(C.t4))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
+this.UH(a,a,z.gvc(),this.gD4(a))},
 UH:function(a,b,c,d){var z,y,x,w,v,u,t
 for(z=c.Fb,z=H.VM(new P.N6(z,z.zN,null,null),[H.Kp(c,0)]),z.zq=z.Fb.H9,y=J.RE(b);z.G();){x=z.fD
 w=y.gI(b).t(0,x)
@@ -12241,27 +12849,27 @@
 t=new W.fd(0,w.bi,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
 w=t.G9
-if(w!=null&&t.VP<=0)J.cZ(t.bi,v,w,u)}},
+if(w!=null&&t.VP<=0)J.FI(t.bi,v,w,u)}},
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
 y=$.Uk()
-x=y.Im(C.eI)
-if(x)y.Ny(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
+x=y.Im(C.t4)
+if(x)y.J4(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
 w=a.a6.gPS()
 v=z.gt5(b)
 u=J.UQ($.pT(),v)
 t=w.t(0,u!=null?u:v)
-if(t!=null){if(x)y.Ny("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$iseC?z.gey(b):null,a])}if(x)y.Ny("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gay",2,0,126,60],
+if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
+this.ea(a,a,t,[b,!!z.$iseC?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,144,76],
 ea:function(a,b,c,d){var z,y,x,w
 z=$.Uk()
-y=z.Im(C.eI)
-if(y)z.Ny(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
-if(!!J.x(c).$isEH){x=X.aW(c)
+y=z.Im(C.t4)
+if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
+if(!!J.x(c).$isEH){x=X.Zpg(c)
 if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
 C.Nm.sB(d,x)
-H.im(c,d,P.Te(null))}else if(typeof c==="string"){w=$.b7().d8.t(0,c)
+H.im(c,d,P.Te(null))}else if(typeof c==="string"){w=$.b7().I1.t(0,c)
 $.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
 if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},
 $isdM:true,
@@ -12270,27 +12878,27 @@
 $ish4:true,
 $isPZ:true,
 $isKV:true},
-Sv:{
-"^":"Xs:51;a",
+dZ:{
+"^":"Tp:67;a",
 $2:function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
 z.t(0,a)},
 $isEH:true},
 Xi:{
-"^":"Xs:42;b",
+"^":"Tp:64;b",
 $0:function(){return this.b},
 $isEH:true},
 TV:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){var z=J.x(a)
 if(!!z.$isdM)z.oW(a)},
 $isEH:true},
-YC:{
-"^":"Xs:10;",
-$1:function(a){return J.D9(!!J.x(a).$isvy?a:M.Ky(a))},
+Sv:{
+"^":"Tp:10;",
+$1:function(a){return J.DB(!!J.x(a).$isvy?a:M.Ky(a))},
 $isEH:true},
-n1:{
-"^":"Xs:51;a,b,c,d,e,f,UI",
+qz:{
+"^":"Tp:67;a,b,c,d,e,f,UI",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.d
 if(typeof a!=="number")return H.s(a)
@@ -12307,49 +12915,49 @@
 if(!q.h(0,p))continue
 o=u.t(v,a)
 s.rJ(t,x,o,b)
-$.cp().Ck(t,p,[b,o,v,r,z],!0,null)}},"$2",null,4,0,null,127,35,"call"],
+$.cp().Ck(t,p,[b,o,v,r,z],!0,null)}},"$2",null,4,0,null,145,54,"call"],
 $isEH:true},
 V1:{
-"^":"Xs:10;a,b,c",
+"^":"Tp:10;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,128,"call"],
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 L6:{
-"^":"Xs:132;a,b",
+"^":"Tp:150;a,b",
 $3:[function(a,b,c){var z,y,x
 z=$.Uk()
-if(z.Im(C.eI))z.Ny("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
+if(z.Im(C.t4))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
 y=J.ZZ(this.b,3)
 x=C.SP.t(0,y)
 if(x!=null)y=x
-return new A.zI(b,y,a,this.a,null)},"$3",null,6,0,null,129,130,131,"call"],
+return new A.zI(b,y,a,this.a,null)},"$3",null,6,0,null,147,148,149,"call"],
 $isEH:true},
 Bf:{
-"^":"Ap;I6,iU,uv,Jq,dY",
+"^":"Ap;I6,iU,jz,Jq,dY",
 AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,17,36],
+$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,17,55],
 ho:[function(a){var z,y,x,w,v
 for(z=J.mY(a),y=this.iU;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
-w=$.cp().Gu.t(0,y)
+w=$.cp().eA.t(0,y)
 if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.AG(z)))
 v=w.$1(z)
 z=this.dY
-if(z==null?v!=null:z!==v)J.Fc(this.uv,v)
-return}}},"$1","gXQ",2,0,133,122],
-TR:function(a,b){return J.mu(this.uv,b)},
-gP:function(a){return J.Vm(this.uv)},
-sP:function(a,b){J.Fc(this.uv,b)
+if(z==null?v!=null:z!==v)J.Fc(this.jz,v)
+return}}},"$1","gXQ",2,0,151,140],
+TR:function(a,b){return J.mu(this.jz,b)},
+gP:function(a){return J.Vm(this.jz)},
+sP:function(a,b){J.Fc(this.jz,b)
 return b},
-xO:function(a){var z=this.Jq
+S6:function(a){var z=this.Jq
 if(z!=null){z.ed()
-this.Jq=null}J.yd(this.uv)}},
+this.Jq=null}J.x0(this.jz)}},
 ir:{
-"^":"qo;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"Ot;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 XI:function(a){this.Pa(a)},
-static:{oaJ:function(a){var z,y,x,w
-z=$.J1()
+static:{G7:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -12368,7 +12976,7 @@
 $ish4:true,
 $isPZ:true,
 $isKV:true},
-qo:{
+Ot:{
 "^":"jpR+Pi;",
 $isd3:true},
 N9:{
@@ -12377,7 +12985,7 @@
 return T.uN.prototype.pm.call(this,a,b,c)}},
 zI:{
 "^":"Ap;v3,pB,U1,ED,Jq",
-zU:[function(a){var z,y,x,w,v,u
+cE:[function(a){var z,y,x,w,v,u
 z=this.v3
 y=A.tT(z)
 x=J.x(y)
@@ -12386,15 +12994,15 @@
 if(C.xB.nC(w,"@")){v=this.U1
 w=L.hk(C.xB.yn(w,1)).Tl(v)}else v=y
 u=J.x(a)
-x.ea(y,v,w,[a,!!u.$iseC?u.gey(a):null,z])},"$1","gwi",2,0,10,60],
+x.ea(y,v,w,[a,!!u.$iseC?u.gey(a):null,z])},"$1","gwi",2,0,10,76],
 gP:function(a){return},
 TR:function(a,b){var z=J.PB(this.v3).t(0,this.pB)
 z=H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gwi()),z.Sg),[H.Kp(z,0)])
 z.Zz()
 this.Jq=z},
-xO:function(a){var z
+S6:function(a){var z
 if(this.Jq!=null){z=$.Uk()
-if(z.Im(C.eI))z.Ny("event.remove: ["+H.d(this.v3)+"]."+H.d(this.pB)+" => ["+H.d(this.U1)+"]."+this.ED+"())")
+if(z.Im(C.t4))z.J4("event.remove: ["+H.d(this.v3)+"]."+H.d(this.pB)+" => ["+H.d(this.U1)+"]."+this.ED+"())")
 this.Jq.ed()
 this.Jq=null}},
 static:{tT:function(a){var z
@@ -12408,25 +13016,26 @@
 this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
 this.Ws()}},"$0","gv6",0,0,15]},
+mS:{
+"^":"Tp:64;",
+$0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
+$isEH:true},
 hp:{
-"^":"Xs:42;",
-$0:[function(){var z=$.mC().MM
+"^":"Tp:64;",
+$0:[function(){var z=$.ln().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"Xs:136;a,b",
-$3:[function(a,b,c){var z,y,x
-z=$.Ej().t(0,b)
-if(z!=null){y=$.RA().t(0,c)
-x=this.a
-x.toString
-return P.T8(x,null,x,new A.v4(a,b,z,y))}return this.b.qP([b,c],a)},"$3",null,6,0,null,134,34,135,"call"],
+"^":"Tp:154;a,b",
+$3:[function(a,b,c){var z=$.Ej().t(0,b)
+if(z!=null)return this.a.Gr(new A.v4(a,b,z,$.RA().t(0,c)))
+return this.b.qP([b,c],a)},"$3",null,6,0,null,152,53,153,"call"],
 $isEH:true},
 v4:{
-"^":"Xs:42;c,d,e,f",
-$0:function(){var z,y,x,w,v,u
+"^":"Tp:64;c,d,e,f",
+$0:[function(){var z,y,x,w,v,u
 z=this.d
 y=this.e
 x=this.f
@@ -12442,184 +13051,184 @@
 v.W3(w)
 v.Mi()
 v.f6()
-v.OL()
+v.m1()
 A.h6(v.J3(v.kO("global"),"global"),document.head)
 v.FU()
 w=v.gZf()
 A.YG(w,z,x!=null?J.O6(x):null)
-if($.yQ().n6(y,C.MT))$.cp().Ck(y,C.MT,[v],!1,null)
+if($.mX().n6(y,C.MT))$.cp().Ck(y,C.MT,[v],!1,null)
 v.Ba(z)
-return},
+return},"$0",null,0,0,null,"call"],
 $isEH:true}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
 Zh:function(a,b,c){var z,y,x
 z=$.QL().t(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.zc.kV(J.JA(a,"'","\""))
+try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
 return a}},
 Md:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return a},
 $isEH:true},
 lP:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return a},
 $isEH:true},
 Uf:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){var z,y
 try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
 Ra:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
 wJY:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return H.BU(a,null,new Z.fT(b))},
 $isEH:true},
 fT:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a},
 $isEH:true},
 zOQ:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return H.RR(a,new Z.Lf(b))},
 $isEH:true},
 Lf:{
-"^":"Xs:10;b",
+"^":"Tp:10;b",
 $1:function(a){return this.b},
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 dA:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8f(a)).zV(0," ")
-else z=!!z.$iscX?z.zV(a," "):a
-return z},"$1","T4",2,0,27],
+if(!!z.$isZ0)z=J.vo(a.gvc(),new T.o8f(a)).zV(0," ")
+else z=!!z.$isQV?z.zV(a," "):a
+return z},"$1","dI",2,0,46],
 qN:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(a.gvc(),new T.GL(a)).zV(0,";")
-else z=!!z.$iscX?z.zV(a,";"):a
-return z},"$1","xe",2,0,27],
+else z=!!z.$isQV?z.zV(a,";"):a
+return z},"$1","xe",2,0,46],
 o8f:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){return J.xC(this.a.t(0,a),!0)},
 $isEH:true},
 GL:{
-"^":"Xs:10;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,137,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 uN:{
 "^":"VE;",
 pm:function(a,b,c){var z,y,x
 z=new Y.pa(H.VM([],[Y.qS]),P.p9(""),new P.WU(a,0,0,null),null)
-y=new U.Fs()
+y=new U.tu()
 y=new T.FX(y,z,null,null)
 z=z.rD()
 y.mV=z
 y.vi=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
 y.Bp()
 x=y.Te()
-if(M.wR(c)){z=J.x(b)
+if(M.RI(c)){z=J.x(b)
 z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isWH}else z=!1
 if(z)return
 return new T.H1(this,b,x)},
 CE:function(a){return new T.uK(this)}},
 H1:{
-"^":"Xs:132;a,b,c",
+"^":"Tp:150;a,b,c",
 $3:[function(a,b,c){var z,y
 if(!J.x(a).$isGK)a=K.xV(a,this.a.jw)
 z=!!J.x(b).$ish4
-y=z&&J.xC(this.b,"class")?T.T4():null
+y=z&&J.xC(this.b,"class")?T.dI():null
 if(z&&J.xC(this.b,"style"))y=T.xe()
 if(c===!0)return T.rD(this.c,a,y)
-return new T.tI(a,y,this.c,null,null,null)},"$3",null,6,0,null,129,130,131,"call"],
+return new T.tI(a,y,this.c,null,null,null)},"$3",null,6,0,null,147,148,149,"call"],
 $isEH:true},
 uK:{
-"^":"Xs:10;a",
-$1:[function(a){return!!J.x(a).$isGK?a:K.xV(a,this.a.jw)},"$1",null,2,0,null,129,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return!!J.x(a).$isGK?a:K.xV(a,this.a.jw)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 tI:{
-"^":"Ap;a9,uI,lV,Nl,DY,ZR",
-Co:function(a){return this.Nl.$1(a)},
-lY:[function(a){var z,y
-z=this.ZR
-y=T.r6(a,this.a9,this.uI)
-this.ZR=y
-if(this.Nl!=null&&!J.xC(z,y))this.Co(this.ZR)},"$1","gR5",2,0,10,138],
-gP:function(a){if(this.Nl!=null)return this.ZR
-return T.rD(this.lV,this.a9,this.uI)},
+"^":"Ap;yr,wx,n4,Fg,ML,HR",
+WV:function(a){return this.Fg.$1(a)},
+Ls:[function(a){var z,y
+z=this.HR
+y=T.r6(a,this.yr,this.wx)
+this.HR=y
+if(this.Fg!=null&&!J.xC(z,y))this.WV(this.HR)},"$1","gkR",2,0,10,156],
+gP:function(a){if(this.Fg!=null)return this.HR
+return T.rD(this.n4,this.yr,this.wx)},
 sP:function(a,b){var z,y,x,w,v
-try{w=this.a9
-z=K.jX(this.lV,b,w)
-this.ZR=T.r6(z,w,this.uI)}catch(v){w=H.Ru(v)
+try{w=this.yr
+z=K.jX(this.n4,b,w)
+this.HR=T.r6(z,w,this.wx)}catch(v){w=H.Ru(v)
 y=w
-x=new H.oP(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.lV)+"': "+H.d(y),x)}},
+x=new H.XO(v,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.n4)+"': "+H.d(y),x)}},
 TR:function(a,b){var z,y,x,w,v,u,t
-if(this.Nl!=null)throw H.b(P.w("already open"))
-this.Nl=b
-w=this.lV
-v=this.a9
+if(this.Fg!=null)throw H.b(P.w("already open"))
+this.Fg=b
+w=this.n4
+v=this.yr
 u=H.VM(new P.Sw(null,0,0,0),[null])
 u.Eo(null,null)
-z=J.okV(w,new K.XZ(v,u))
-this.lV=z
-u=z.glr().yI(this.gR5())
+z=J.okV(w,new K.Oy(v,u))
+this.n4=z
+u=z.glr().yI(this.gkR())
 u.fm(0,new T.Tg(z))
-this.DY=u
+this.ML=u
 try{w=z
 J.okV(w,new K.Ed(v))
-w.gK3()
-this.ZR=T.r6(z.gK3(),v,this.uI)}catch(t){w=H.Ru(t)
+w.gXr()
+this.HR=T.r6(z.gXr(),v,this.wx)}catch(t){w=H.Ru(t)
 y=w
-x=new H.oP(t,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(z)+"': "+H.d(y),x)}return this.ZR},
-xO:function(a){if(this.Nl==null)return
-this.DY.ed()
-this.DY=null
-this.lV=H.Go(this.lV,"$isdE").KL
-this.Nl=null},
+x=new H.XO(t,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(z)+"': "+H.d(y),x)}return this.HR},
+S6:function(a){if(this.Fg==null)return
+this.ML.ed()
+this.ML=null
+this.n4=H.Go(this.n4,"$isdE").KL
+this.Fg=null},
 static:{rD:function(a,b,c){var z,y,x,w
 try{x=T.r6(K.Cw(a,b),b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(z),y)}return},r6:function(a,b,c){if(!!J.x(a).$isfk)return J.OS(J.kl(a.bm,new T.bI(a,b)),!1)
+y=new H.XO(w,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(z),y)}return},r6:function(a,b,c){if(!!J.x(a).$isfk)return J.np(J.kl(a.bm,new T.bI(a,b)),!1)
 else return c==null?a:c.$1(a)}}},
 bI:{
-"^":"Xs:10;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){var z=this.a.xG
 if(J.xC(z,"this"))H.vh(K.xn("'this' cannot be used as a variable name."))
-return new K.ig(this.b,z,a)},"$1",null,2,0,null,127,"call"],
+return new K.ig(this.b,z,a)},"$1",null,2,0,null,145,"call"],
 $isEH:true},
 Tg:{
-"^":"Xs:51;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a)+"': "+H.d(a),b)},"$2",null,4,0,null,1,120,"call"],
+"^":"Tp:67;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a)+"': "+H.d(a),b)},"$2",null,4,0,null,1,138,"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 De:{
 "^":"Sk;vq,u1,AP,fn",
-vb:function(a,b){this.vq.yI(new B.iH(b,this))},
+vb:function(a,b){this.vq.yI(new B.DH(b,this))},
 $asSk:function(a){return[null]},
 static:{z4:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
-iH:{
-"^":"Xs;a,b",
+DH:{
+"^":"Tp;a,b",
 $1:[function(a){var z=this.b
-z.u1=F.Wi(z,C.YI,z.u1,a)},"$1",null,2,0,null,127,"call"],
+z.u1=F.Wi(z,C.zdr,z.u1,a)},"$1",null,2,0,null,145,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"WM",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
+$signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
 Cw:function(a,b){var z,y
 z=new P.Sw(null,0,0,0)
 z.$builtinTypeInfo=[null]
 z.Eo(null,null)
-y=J.okV(a,new K.XZ(b,z))
+y=J.okV(a,new K.Oy(b,z))
 J.okV(y,new K.Ed(b))
-return y.gfC()},
+return y.gLv()},
 jX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
@@ -12635,7 +13244,7 @@
 t=z.a.ghP()
 u=J.Vm(z.a.gJn())
 s=!0}else{if(!!v.$isx9){t=w.ghP()
-u=J.O6(z.a)}else if(!!v.$isJy){t=w.ghP()
+u=J.O6(z.a)}else if(!!v.$isNb){t=w.ghP()
 if(J.I1(z.a)!=null){if(z.a.gre()!=null)y.$0()
 u=J.I1(z.a)}else{y.$0()
 u=null}}else{y.$0()
@@ -12644,13 +13253,13 @@
 y=new P.Sw(null,0,0,0)
 y.$builtinTypeInfo=[null]
 y.Eo(null,null)
-q=J.okV(r,new K.XZ(c,y))
+q=J.okV(r,new K.Oy(c,y))
 J.okV(q,new K.Ed(c))
-q.gfC()
+q.gLv()
 throw H.b(K.xn("filter must implement Transformer: "+H.d(r)))}p=K.Cw(t,c)
 if(p==null)throw H.b(K.xn("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else{z=$.b7().d8.t(0,u)
+else{z=$.b7().I1.t(0,u)
 $.cp().Cq(p,z,b)}return b},
 xV:function(a,b){var z,y,x
 z=new K.nk(a)
@@ -12661,74 +13270,74 @@
 if(y.x4("this"))H.vh(K.xn("'this' cannot be used as a variable name."))
 y=x}return y},
 lPa:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return J.ew(a,b)},
 $isEH:true},
 Ufa:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return J.Hn(a,b)},
 $isEH:true},
 Raa:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 w0:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return J.L9(a,b)},
 $isEH:true},
 w5:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w10:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w11:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return J.z8(a,b)},
 $isEH:true},
 w12:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 w13:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 w14:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
 w15:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
 w16:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
 w17:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.$1(a)
 throw H.b(K.xn("Filters must be a one-argument function."))},
 $isEH:true},
 w18:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return a},
 $isEH:true},
 w19:{
-"^":"Xs:10;",
-$1:function(a){return J.jz(a)},
+"^":"Tp:10;",
+$1:function(a){return J.jzo(a)},
 $isEH:true},
 w20:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:function(a){return a!==!0},
 $isEH:true},
 c4:{
-"^":"Xs:42;a",
+"^":"Tp:64;a",
 $0:function(){return H.vh(K.xn("Expression is not assignable: "+H.d(this.a.a)))},
 $isEH:true},
 GK:{
@@ -12741,7 +13350,7 @@
 "^":"GK;ku<",
 t:function(a,b){var z,y
 if(J.xC(b,"this"))return this.ku
-z=$.b7().d8.t(0,b)
+z=$.b7().I1.t(0,b)
 y=this.ku
 if(y==null||z==null)throw H.b(K.xn("variable '"+H.d(b)+"' not found"))
 y=$.cp().jD(y,z)
@@ -12764,21 +13373,21 @@
 AC:function(a){if(this.Z3.x4(a))return!1
 return!J.xC(a,"this")}},
 dE:{
-"^":"a;Lf?,fC<",
+"^":"a;bO?,Lv<",
 glr:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gK3:function(){return this.fC},
+gXr:function(){return this.Lv},
 Qh:function(a){},
 l8:function(a){var z
 this.OJ(a)
-z=this.Lf
+z=this.bO
 if(z!=null)z.l8(a)},
 OJ:function(a){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
-this.tj=null}y=this.fC
+this.tj=null}y=this.Lv
 this.Qh(a)
-z=this.fC
+z=this.Lv
 if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
 x.Iv(z)}},
@@ -12790,37 +13399,37 @@
 xn:function(a){a.OJ(this.qu)},
 ky:function(a){J.okV(a.gT8(a),this)
 a.OJ(this.qu)}},
-XZ:{
+Oy:{
 "^":"Jg;qu,lk",
 W9:function(a){return new K.uD(a,null,null,null,P.bK(null,null,!1,null))},
 LT:function(a){return a.wz.RR(0,this)},
-T7:function(a){var z,y
+fV:function(a){var z,y
 z=J.okV(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sLf(y)
+z.sbO(y)
 return y},
 CU:function(a){var z,y,x
 z=J.okV(a.ghP(),this)
 y=J.okV(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sLf(x)
-y.sLf(x)
+z.sbO(x)
+y.sbO(x)
 return x},
-og:function(a){var z,y,x,w,v
+ZR:function(a){var z,y,x,w,v
 z=J.okV(a.ghP(),this)
 if(a.gre()==null)y=null
 else{x=a.gre()
 w=this.gnG()
 x.toString
 y=H.VM(new H.lJ(x,w),[null,null]).tt(0,!1)}v=new K.xJ(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sLf(v)
-if(y!=null)H.bQ(y,new K.o4(v))
+z.sbO(v)
+if(y!=null)H.bQ(y,new K.zD(v))
 return v},
 oD:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
 z=H.VM(new H.lJ(a.ghL(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.kL(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.XV(y))
+H.bQ(z,new K.Gzk(y))
 return y},
 o0:function(a){var z,y
 z=H.VM(new H.lJ(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
@@ -12831,269 +13440,269 @@
 z=J.okV(a.gG3(a),this)
 y=J.okV(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sLf(x)
-y.sLf(x)
+z.sbO(x)
+y.sbO(x)
 return x},
 qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
 x=new K.iv(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sLf(x)
-y.sLf(x)
+z.sbO(x)
+y.sbO(x)
 return x},
 Hx:function(a){var z,y
 z=J.okV(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sLf(y)
+z.sbO(y)
 return y},
 RD:function(a){var z,y,x,w
 z=J.okV(a.gdc(),this)
 y=J.okV(a.gSl(),this)
 x=J.okV(a.gru(),this)
-w=new K.dD(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sLf(w)
-y.sLf(w)
-x.sLf(w)
+w=new K.an(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
+z.sbO(w)
+y.sbO(w)
+x.sbO(w)
 return w},
 ky:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
-y.sLf(x)
+y.sbO(x)
 return x}},
-o4:{
-"^":"Xs:10;a",
+zD:{
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
-a.sLf(z)
+a.sbO(z)
 return z},
 $isEH:true},
-XV:{
-"^":"Xs:10;a",
+Gzk:{
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
-a.sLf(z)
+a.sbO(z)
 return z},
 $isEH:true},
 B8:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
-a.sLf(z)
+a.sbO(z)
 return z},
 $isEH:true},
 uD:{
-"^":"dE;KL,Lf,tj,fC,k6",
-Qh:function(a){this.fC=a.gku()},
+"^":"dE;KL,bO,tj,Lv,k6",
+Qh:function(a){this.Lv=a.gku()},
 RR:function(a,b){return b.W9(this)},
 $asdE:function(){return[U.WH]},
 $isWH:true,
 $ishw:true},
 z0:{
-"^":"dE;KL,Lf,tj,fC,k6",
+"^":"dE;KL,bO,tj,Lv,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
 Qh:function(a){var z=this.KL
-this.fC=z.gP(z)},
+this.Lv=z.gP(z)},
 RR:function(a,b){return b.oD(this)},
 $asdE:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 kL:{
-"^":"dE;hL<,KL,Lf,tj,fC,k6",
-Qh:function(a){this.fC=H.VM(new H.lJ(this.hL,new K.Hv()),[null,null]).tt(0,!1)},
+"^":"dE;hL<,KL,bO,tj,Lv,k6",
+Qh:function(a){this.Lv=H.VM(new H.lJ(this.hL,new K.Hv()),[null,null]).tt(0,!1)},
 RR:function(a,b){return b.Zh(this)},
 $asdE:function(){return[U.c0]},
 $isc0:true,
 $ishw:true},
 Hv:{
-"^":"Xs:10;",
-$1:[function(a){return a.gfC()},"$1",null,2,0,null,127,"call"],
+"^":"Tp:10;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,145,"call"],
 $isEH:true},
 ev:{
-"^":"dE;Rl>,KL,Lf,tj,fC,k6",
-Qh:function(a){this.fC=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Xv())},
+"^":"dE;Rl>,KL,bO,tj,Lv,k6",
+Qh:function(a){this.Lv=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
 RR:function(a,b){return b.o0(this)},
-$asdE:function(){return[U.Mm]},
-$isMm:true,
+$asdE:function(){return[U.Qb]},
+$isQb:true,
 $ishw:true},
-Xv:{
-"^":"Xs:51;",
-$2:function(a,b){J.kW(a,J.Kt(b).gfC(),b.gv4().gfC())
+Ku:{
+"^":"Tp:67;",
+$2:function(a,b){J.kW(a,J.Kt(b).gLv(),b.gv4().gLv())
 return a},
 $isEH:true},
 qR:{
-"^":"dE;G3>,v4<,KL,Lf,tj,fC,k6",
+"^":"dE;G3>,v4<,KL,bO,tj,Lv,k6",
 RR:function(a,b){return b.YV(this)},
 $asdE:function(){return[U.ae]},
 $isae:true,
 $ishw:true},
 ek:{
-"^":"dE;KL,Lf,tj,fC,k6",
+"^":"dE;KL,bO,tj,Lv,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
 Qh:function(a){var z,y,x,w
 z=this.KL
-this.fC=a.t(0,z.gP(z))
+this.Lv=a.t(0,z.gP(z))
 if(!a.AC(z.gP(z)))return
 y=a.gku()
 x=J.x(y)
 if(!x.$isd3)return
 z=z.gP(z)
-w=$.b7().d8.t(0,z)
+w=$.b7().I1.t(0,z)
 this.tj=x.gqh(y).yI(new K.OC(this,a,w))},
 RR:function(a,b){return b.qv(this)},
 $asdE:function(){return[U.elO]},
 $iselO:true,
 $ishw:true},
 OC:{
-"^":"Xs:10;a,b,c",
-$1:[function(a){if(J.pb(a,new K.av(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,128,"call"],
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.GC(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
-av:{
-"^":"Xs:10;d",
+GC:{
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 mv:{
-"^":"dE;wz<,KL,Lf,tj,fC,k6",
+"^":"dE;wz<,KL,bO,tj,Lv,k6",
 gxS:function(a){var z=this.KL
 return z.gxS(z)},
 Qh:function(a){var z,y
 z=this.KL
 y=$.qL().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"!")){z=this.wz.gfC()
-this.fC=y.$1(z==null?!1:z)}else{z=this.wz
-this.fC=z.gfC()==null?null:y.$1(z.gfC())}},
+if(J.xC(z.gxS(z),"!")){z=this.wz.gLv()
+this.Lv=y.$1(z==null?!1:z)}else{z=this.wz
+this.Lv=z.gLv()==null?null:y.$1(z.gLv())}},
 RR:function(a,b){return b.Hx(this)},
 $asdE:function(){return[U.cJ]},
 $iscJ:true,
 $ishw:true},
 iv:{
-"^":"dE;Bb>,T8>,KL,Lf,tj,fC,k6",
+"^":"dE;Bb>,T8>,KL,bO,tj,Lv,k6",
 gxS:function(a){var z=this.KL
 return z.gxS(z)},
 Qh:function(a){var z,y,x
 z=this.KL
 y=$.Jl().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gfC()
+if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gLv()
 if(z==null)z=!1
-x=this.T8.gfC()
-this.fC=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.fC=y.$2(this.Bb.gfC(),this.T8.gfC())
+x=this.T8.gLv()
+this.Lv=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.Lv=y.$2(this.Bb.gLv(),this.T8.gLv())
 else{x=this.Bb
-if(x.gfC()==null||this.T8.gfC()==null)this.fC=null
-else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gfC()).$iswn)this.tj=H.Go(x.gfC(),"$iswn").gRT().yI(new K.P8(this,a))
-this.fC=y.$2(x.gfC(),this.T8.gfC())}}},
+if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
+else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gRT().yI(new K.P8(this,a))
+this.Lv=y.$2(x.gLv(),this.T8.gLv())}}},
 RR:function(a,b){return b.ex(this)},
 $asdE:function(){return[U.Mp]},
 $isMp:true,
 $ishw:true},
 P8:{
-"^":"Xs:10;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
-dD:{
-"^":"dE;dc<,Sl<,ru<,KL,Lf,tj,fC,k6",
-Qh:function(a){var z=this.dc.gfC()
-this.fC=(z==null?!1:z)===!0?this.Sl.gfC():this.ru.gfC()},
+an:{
+"^":"dE;dc<,Sl<,ru<,KL,bO,tj,Lv,k6",
+Qh:function(a){var z=this.dc.gLv()
+this.Lv=(z==null?!1:z)===!0?this.Sl.gLv():this.ru.gLv()},
 RR:function(a,b){return b.RD(this)},
-$asdE:function(){return[U.x0]},
-$isx0:true,
+$asdE:function(){return[U.HB]},
+$isHB:true,
 $ishw:true},
 vl:{
-"^":"dE;hP<,KL,Lf,tj,fC,k6",
+"^":"dE;hP<,KL,bO,tj,Lv,k6",
 goc:function(a){var z=this.KL
 return z.goc(z)},
 Qh:function(a){var z,y,x
-z=this.hP.gfC()
-if(z==null){this.fC=null
+z=this.hP.gLv()
+if(z==null){this.Lv=null
 return}y=this.KL
 y=y.goc(y)
-x=$.b7().d8.t(0,y)
-this.fC=$.cp().jD(z,x)
+x=$.b7().I1.t(0,y)
+this.Lv=$.cp().jD(z,x)
 y=J.x(z)
-if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.Zu(this,a,x))},
-RR:function(a,b){return b.T7(this)},
+if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.e9n(this,a,x))},
+RR:function(a,b){return b.fV(this)},
 $asdE:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
-Zu:{
-"^":"Xs:10;a,b,c",
-$1:[function(a){if(J.pb(a,new K.WKb(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,128,"call"],
+e9n:{
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.WKb(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 WKb:{
-"^":"Xs:10;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 iT:{
-"^":"dE;hP<,Jn<,KL,Lf,tj,fC,k6",
+"^":"dE;hP<,Jn<,KL,bO,tj,Lv,k6",
 Qh:function(a){var z,y,x
-z=this.hP.gfC()
-if(z==null){this.fC=null
-return}y=this.Jn.gfC()
+z=this.hP.gLv()
+if(z==null){this.Lv=null
+return}y=this.Jn.gLv()
 x=J.U6(z)
-this.fC=x.t(z,y)
+this.Lv=x.t(z,y)
 if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.tE(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asdE:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
 tE:{
-"^":"Xs:10;a,b,c",
-$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,128,"call"],
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.ey(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 ey:{
-"^":"Xs:10;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.d)},
 $isEH:true},
 xJ:{
-"^":"dE;hP<,re<,KL,Lf,tj,fC,k6",
+"^":"dE;hP<,re<,KL,bO,tj,Lv,k6",
 gSf:function(a){var z=this.KL
 return z.gSf(z)},
 Qh:function(a){var z,y,x,w
 z=this.re
 z.toString
 y=H.VM(new H.lJ(z,new K.WW()),[null,null]).br(0)
-x=this.hP.gfC()
-if(x==null){this.fC=null
+x=this.hP.gLv()
+if(x==null){this.Lv=null
 return}z=this.KL
 if(z.gSf(z)==null){z=H.im(x,y,P.Te(null))
-this.fC=!!J.x(z).$iscb?B.z4(z,null):z}else{z=z.gSf(z)
-w=$.b7().d8.t(0,z)
-this.fC=$.cp().Ck(x,w,y,!1,null)
+this.Lv=!!J.x(z).$iscb?B.z4(z,null):z}else{z=z.gSf(z)
+w=$.b7().I1.t(0,z)
+this.Lv=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
 if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.vQ(this,a,w))}},
-RR:function(a,b){return b.og(this)},
-$asdE:function(){return[U.Jy]},
-$isJy:true,
+RR:function(a,b){return b.ZR(this)},
+$asdE:function(){return[U.Nb]},
+$isNb:true,
 $ishw:true},
 WW:{
-"^":"Xs:10;",
-$1:[function(a){return a.gfC()},"$1",null,2,0,null,24,"call"],
+"^":"Tp:10;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,43,"call"],
 $isEH:true},
 vQ:{
-"^":"Xs:139;a,b,c",
-$1:[function(a){if(J.pb(a,new K.ho(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,128,"call"],
+"^":"Tp:157;a,b,c",
+$1:[function(a){if(J.xq(a,new K.ho(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 ho:{
-"^":"Xs:10;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 VA:{
-"^":"dE;Bb>,T8>,KL,Lf,tj,fC,k6",
+"^":"dE;Bb>,T8>,KL,bO,tj,Lv,k6",
 Qh:function(a){var z,y,x,w
 z=this.Bb
-y=this.T8.gfC()
+y=this.T8.gLv()
 x=J.x(y)
-if(!x.$iscX&&y!=null)throw H.b(K.xn("right side of 'in' is not an iterator"))
+if(!x.$isQV&&y!=null)throw H.b(K.xn("right side of 'in' is not an iterator"))
 if(!!x.$iswn)this.tj=y.gRT().yI(new K.OF(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.fC=new K.fk(x,w)},
+this.Lv=new K.fk(x,w)},
 RR:function(a,b){return b.ky(this)},
-$asdE:function(){return[U.Cu]},
-$isCu:true,
+$asdE:function(){return[U.ma]},
+$isma:true,
 $ishw:true},
 OF:{
-"^":"Xs:10;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 fk:{
@@ -13112,19 +13721,19 @@
 if(z>=b.length)return H.e(b,z)
 if(!J.xC(y,b[z]))return!1}return!0},
 b1:function(a){a.toString
-return U.OT(H.n3(a,0,new U.xs()))},
+return U.Le(H.n3(a,0,new U.xs()))},
 Zd:function(a,b){var z=J.ew(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
-OT:function(a){if(typeof a!=="number")return H.s(a)
+Le: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)},
-Fs:{
+tu:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,140,1,24]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,158,1,43]},
 hw:{
 "^":"a;",
 $ishw:true},
@@ -13151,16 +13760,16 @@
 return!!J.x(b).$isc0&&U.Pu(b.ghL(),this.hL)},
 giO:function(a){return U.b1(this.hL)},
 $isc0:true},
-Mm:{
+Qb:{
 "^":"hw;Rl>",
 RR:function(a,b){return b.o0(this)},
 bu:function(a){return"{"+H.d(this.Rl)+"}"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isMm&&U.Pu(z.gRl(b),this.Rl)},
+return!!z.$isQb&&U.Pu(z.gRl(b),this.Rl)},
 giO:function(a){return U.b1(this.Rl)},
-$isMm:true},
+$isQb:true},
 ae:{
 "^":"hw;G3>,v4<",
 RR:function(a,b){return b.YV(this)},
@@ -13172,16 +13781,16 @@
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
-return U.OT(U.Zd(U.Zd(0,z),y))},
+return U.Le(U.Zd(U.Zd(0,z),y))},
 $isae:true},
-Iq:{
+XC:{
 "^":"hw;wz",
 RR:function(a,b){return b.LT(this)},
 bu:function(a){return"("+H.d(this.wz)+")"},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isIq&&J.xC(b.wz,this.wz)},
+return!!J.x(b).$isXC&&J.xC(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
-$isIq:true},
+$isXC:true},
 elO:{
 "^":"hw;P>",
 RR:function(a,b){return b.qv(this)},
@@ -13203,7 +13812,7 @@
 giO:function(a){var z,y
 z=J.v1(this.xS)
 y=J.v1(this.wz)
-return U.OT(U.Zd(U.Zd(0,z),y))},
+return U.Le(U.Zd(U.Zd(0,z),y))},
 $iscJ:true},
 Mp:{
 "^":"hw;xS>,Bb>,T8>",
@@ -13217,34 +13826,34 @@
 z=J.v1(this.xS)
 y=J.v1(this.Bb)
 x=J.v1(this.T8)
-return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
+return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
 $isMp:true},
-x0:{
+HB:{
 "^":"hw;dc<,Sl<,ru<",
 RR:function(a,b){return b.RD(this)},
 bu:function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isx0&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
+return!!J.x(b).$isHB&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
 giO:function(a){var z,y,x
 z=J.v1(this.dc)
 y=J.v1(this.Sl)
 x=J.v1(this.ru)
-return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
-$isx0:true},
-Cu:{
+return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
+$isHB:true},
+ma:{
 "^":"hw;Bb>,T8>",
 RR:function(a,b){return b.ky(this)},
 bu:function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isCu&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+return!!z.$isma&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
 y=J.v1(this.T8)
-return U.OT(U.Zd(U.Zd(0,z),y))},
-$isCu:true},
+return U.Le(U.Zd(U.Zd(0,z),y))},
+$isma:true},
 zX:{
 "^":"hw;hP<,Jn<",
 RR:function(a,b){return b.CU(this)},
@@ -13254,11 +13863,11 @@
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
-return U.OT(U.Zd(U.Zd(0,z),y))},
+return U.Le(U.Zd(U.Zd(0,z),y))},
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:function(a,b){return b.T7(this)},
+RR:function(a,b){return b.fV(this)},
 bu:function(a){return H.d(this.hP)+"."+H.d(this.oc)},
 n:function(a,b){var z
 if(b==null)return!1
@@ -13267,31 +13876,31 @@
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
-return U.OT(U.Zd(U.Zd(0,z),y))},
+return U.Le(U.Zd(U.Zd(0,z),y))},
 $isx9:true},
-Jy:{
+Nb:{
 "^":"hw;hP<,Sf>,re<",
-RR:function(a,b){return b.og(this)},
+RR:function(a,b){return b.ZR(this)},
 bu:function(a){return H.d(this.hP)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isJy&&J.xC(b.ghP(),this.hP)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
+return!!z.$isNb&&J.xC(b.ghP(),this.hP)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
 y=J.v1(this.Sf)
 x=U.b1(this.re)
-return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
-$isJy:true},
+return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
+$isNb:true},
 xs:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return U.Zd(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
 "^":"a;rp,AO,mV,vi",
 gQi:function(){return this.vi.lo},
-zM:function(a,b){var z
+HA:function(a,b){var z
 if(a!=null){z=this.vi.lo
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
 if(!z)if(b!=null){z=this.vi.lo
@@ -13299,15 +13908,15 @@
 else z=!0
 if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
 this.vi.G()},
-Bp:function(){return this.zM(null,null)},
-GI:function(a){return this.zM(a,null)},
+Bp:function(){return this.HA(null,null)},
+GI:function(a){return this.HA(a,null)},
 Te:function(){if(this.vi.lo==null){this.rp.toString
 return C.x4}var z=this.Yq()
-return z==null?null:this.FH(z,0)},
-FH:function(a,b){var z,y,x,w,v,u
+return z==null?null:this.tF(z,0)},
+tF:function(a,b){var z,y,x,w,v,u
 for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.GN()
 this.rp.toString
-a=new U.Jy(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
+a=new U.Nb(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
 this.rp.toString
 a=new U.zX(a,x)}else break
 else if(J.xC(J.Iz(this.vi.lo),3)){this.Bp()
@@ -13315,25 +13924,25 @@
 this.Bp()
 w=this.Te()
 this.rp.toString
-a=new U.Cu(a,w)}else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
+a=new U.ma(a,w)}else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.zM(8,"?")
+if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.HA(8,"?")
 v=this.Te()
 this.GI(5)
 u=this.Te()
 this.rp.toString
-a=new U.x0(a,v,u)}else a=this.ZJ(a)
+a=new U.HB(a,v,u)}else a=this.ZJ(a)
 else break}return a},
 j6:function(a,b){var z,y
 z=J.x(b)
 if(!!z.$iselO){z=z.gP(b)
 this.rp.toString
-return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$iselO){z=J.Vm(b.ghP())
+return new U.x9(a,z)}else if(!!z.$isNb&&!!J.x(b.ghP()).$iselO){z=J.Vm(b.ghP())
 y=b.gre()
 this.rp.toString
-return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
+return new U.Nb(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
 ZJ:function(a){var z,y,x,w
 z=this.vi.lo
 this.Bp()
@@ -13347,7 +13956,7 @@
 x=w}else x=!1
 else x=!1
 if(!x)break
-y=this.FH(y,this.vi.lo.gP9())}x=J.Vm(z)
+y=this.tF(y,this.vi.lo.gP9())}x=J.Vm(z)
 this.rp.toString
 return new U.Mp(x,a,y)},
 Yq:function(){var z,y,x,w
@@ -13365,10 +13974,10 @@
 z=new U.no(x)
 z.$builtinTypeInfo=[null]
 this.Bp()
-return z}else{w=this.FH(this.yL(),11)
+return z}else{w=this.tF(this.yL(),11)
 y.toString
 return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
-w=this.FH(this.yL(),11)
+w=this.tF(this.yL(),11)
 this.rp.toString
 return new U.cJ(z,w)}}return this.yL()},
 yL:function(){var z,y,x
@@ -13381,12 +13990,12 @@
 case 2:return this.qK()
 case 1:return this.ef()
 case 6:return this.DS()
-case 7:return this.ot()
+case 7:return this.Xk()
 case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
 x=this.Te()
-this.zM(9,")")
+this.HA(9,")")
 this.rp.toString
-return new U.Iq(x)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
+return new U.XC(x)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
 else if(J.xC(J.Vm(this.vi.lo),"["))return this.S9()
 return
 case 5:throw H.b(P.u("unexpected token \":\""))
@@ -13397,7 +14006,7 @@
 if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"]"))break
 z.push(this.Te())
 y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.zM(9,"]")
+this.HA(9,"]")
 return new U.c0(z)},
 pH:function(){var z,y,x
 z=[]
@@ -13408,11 +14017,11 @@
 x=new U.no(y)
 x.$builtinTypeInfo=[null]
 this.Bp()
-this.zM(5,":")
+this.HA(5,":")
 z.push(new U.ae(x,this.Te()))
 y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.zM(9,"}")
-return new U.Mm(z)},
+this.HA(9,"}")
+return new U.Qb(z)},
 qK:function(){var z,y,x
 if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
 this.rp.toString
@@ -13427,7 +14036,7 @@
 y=new U.elO(z)
 x=this.GN()
 if(x==null)return y
-else return new U.Jy(y,null,x)},
+else return new U.Nb(y,null,x)},
 GN:function(){var z,y
 z=this.vi.lo
 if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"(")){y=[]
@@ -13435,13 +14044,13 @@
 if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),")"))break
 y.push(this.Te())
 z=this.vi.lo}while(z!=null&&J.xC(J.Vm(z),","))
-this.zM(9,")")
+this.HA(9,")")
 return y}return},
 Ew:function(){var z,y
 z=this.vi.lo
 if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"[")){this.Bp()
 y=this.Te()
-this.zM(9,"]")
+this.HA(9,"]")
 return y}return},
 ef:function(){var z,y
 z=J.Vm(this.vi.lo)
@@ -13462,9 +14071,9 @@
 y=H.VM(new U.no(z),[null])
 this.Bp()
 return y},
-ot:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+Xk:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-C7:[function(a){return H.VM(new K.Bt(a),[null])},"$1","yU",2,0,45,46],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","G5",2,0,61,62],
 O1:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
@@ -13474,11 +14083,11 @@
 $isO1:true},
 Bt:{
 "^":"mW;F5",
-gA:function(a){var z=new K.kd(J.mY(this.F5),0,null)
+gA:function(a){var z=new K.vR(J.mY(this.F5),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return J.q8(this.F5)},
-gl0:function(a){return J.FN(this.F5)},
+gl0:function(a){return J.tx(this.F5)},
 grZ:function(a){var z,y
 z=this.F5
 y=J.U6(z)
@@ -13486,15 +14095,15 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a){return[[K.O1,a]]},
-$ascX:function(a){return[[K.O1,a]]}},
-kd:{
-"^":"AC;Tr,Mv,Ta",
+$asQV:function(a){return[[K.O1,a]]}},
+vR:{
+"^":"Yl;Tr,Mv,Ta",
 gl:function(){return this.Ta},
 G:function(){var z=this.Tr
 if(z.G()){this.Ta=H.VM(new K.O1(this.Mv++,z.gl()),[null])
 return!0}this.Ta=null
 return!1},
-$asAC:function(a){return[[K.O1,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+$asYl:function(a){return[[K.O1,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 Ox:function(a){switch(a){case 102:return 12
 case 110:return 10
@@ -13521,17 +14130,17 @@
 else if(x===46){x=z.G()?z.Wn:null
 this.x0=x
 if(typeof x!=="number")return H.s(x)
-if(48<=x&&x<=57)this.e1()
+if(48<=x&&x<=57)this.oz()
 else y.push(new Y.qS(3,".",11))}else if(x===44){this.x0=z.G()?z.Wn:null
 y.push(new Y.qS(4,",",0))}else if(x===58){this.x0=z.G()?z.Wn:null
 y.push(new Y.qS(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.x0
 x=z.G()?z.Wn:null
 this.x0=x
 if(C.Nm.tg(C.bg,x)){x=this.x0
-u=H.eT([v,x])
+u=H.BZ([v,x])
 if(C.Nm.tg(C.G8,u)){this.x0=z.G()?z.Wn:null
 t=u}else t=H.Lw(v)}else t=H.Lw(v)
-y.push(new Y.qS(8,t,C.Mk.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.Lw(this.x0)
+y.push(new Y.qS(8,t,C.Mk.t(0,t)))}else if(C.Nm.tg(C.ML,this.x0)){s=H.Lw(this.x0)
 y.push(new Y.qS(9,s,C.Mk.t(0,s)))
 this.x0=z.G()?z.Wn:null}else this.x0=z.G()?z.Wn:null}return y},
 WG:function(){var z,y,x,w
@@ -13577,10 +14186,10 @@
 this.x0=z.G()?z.Wn:null}if(x===46){z=z.G()?z.Wn:null
 this.x0=z
 if(typeof z!=="number")return H.s(z)
-if(48<=z&&z<=57)this.e1()
+if(48<=z&&z<=57)this.oz()
 else this.MV.push(new Y.qS(3,".",11))}else{this.MV.push(new Y.qS(6,y.vM,0))
 y.vM=""}},
-e1:function(){var z,y,x,w
+oz:function(){var z,y,x,w
 z=this.zy
 z.KF(H.Lw(46))
 y=this.jI
@@ -13599,19 +14208,19 @@
 "^":"",
 Jg:{
 "^":"a;",
-DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,141,120]},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,159,138]},
 cfS:{
 "^":"Jg;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
 LT:function(a){a.wz.RR(0,this)
 this.xn(a)},
-T7:function(a){J.okV(a.ghP(),this)
+fV:function(a){J.okV(a.ghP(),this)
 this.xn(a)},
 CU:function(a){J.okV(a.ghP(),this)
 J.okV(a.gJn(),this)
 this.xn(a)},
-og:function(a){var z
+ZR:function(a){var z
 J.okV(a.ghP(),this)
 if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
@@ -13640,11 +14249,11 @@
 this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 qZ:{
-"^":"V30;GF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V39;GF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 giJ:function(a){return a.GF},
 siJ:function(a,b){a.GF=this.ct(a,C.j2,a.GF,b)},
 static:{RH:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -13652,17 +14261,17 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.Cc.ZL(a)
-C.Cc.XI(a)
+C.Vp.ZL(a)
+C.Vp.XI(a)
 return a}}},
-V30:{
+V39:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
-Uy:{
-"^":"V31;oX,GR,cI,FZ,Kf,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gIs:function(a){return a.oX},
-sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
+ov:{
+"^":"V40;Ny,GR,cI,FZ,Kf,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gIs:function(a){return a.Ny},
+sIs:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
 gBV:function(a){return a.GR},
 sBV:function(a,b){a.GR=this.ct(a,C.tW,a.GR,b)},
 gMl:function(a){return a.cI},
@@ -13672,30 +14281,30 @@
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
 rh:[function(a,b){this.Kn(a)
-this.ct(a,C.wq,0,1)},"$1","grO",2,0,17,35],
-fX:[function(a,b){this.Kn(a)},"$1","gXN",2,0,17,35],
-OM:[function(a,b){this.ct(a,C.SA,0,1)
-this.ct(a,C.wq,0,1)},"$1","gTA",2,0,10,35],
+this.ct(a,C.wq,0,1)},"$1","grO",2,0,17,54],
+fX:[function(a,b){this.Kn(a)},"$1","gIF",2,0,17,54],
+xx:[function(a,b){this.ct(a,C.SA,0,1)
+this.ct(a,C.wq,0,1)},"$1","gTA",2,0,10,54],
 fT:[function(a,b){var z,y
-z=a.oX
+z=a.Ny
 if(z==null||a.FZ!==!0)return"min-width:32px;"
 y=z.gu9().Zp.t(0,b.gRd())
 if(y==null)return"min-width:32px;"
 if(J.xC(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,142,143],
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,160,161],
 Kn:function(a){var z,y,x,w,v
-if(J.iS(a.oX)!==!0){J.SK(a.oX).ml(new T.Wd(a))
+if(J.iS(a.Ny)!==!0){J.SK(a.Ny).ml(new T.Wd(a))
 return}this.ct(a,C.SA,0,1)
 J.U2(a.Kf)
-z=a.oX.q6(a.GR)
+z=a.Ny.q6(a.GR)
 if(z!=null){y=a.cI
-x=a.oX
+x=a.Ny
 if(y==null)J.bi(a.Kf,J.UQ(J.de(x),J.Hn(z,1)))
 else{w=x.q6(y)
-for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Kf,J.UQ(J.de(a.oX),y.W(v,1)))}}},
-static:{"^":"bN,MRW,VnP",T5:function(a){var z,y,x,w,v
+for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),y.W(v,1)))}}},
+static:{"^":"bN,MRW,VnP",Zz:function(a){var z,y,x,w,v
 z=R.tB([])
-y=$.J1()
+y=$.XZ()
 x=P.YM(null,null,null,P.qU,W.I0)
 w=P.qU
 v=W.h4
@@ -13708,23 +14317,23 @@
 C.oA.ZL(a)
 C.oA.XI(a)
 return a}}},
-V31:{
+V40:{
 "^":"uL+Pi;",
 $isd3:true},
 Wd:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0)J.vH(z)},"$1",null,2,0,null,11,"call"],
+if(J.iS(z.Ny)===!0)J.vH(z)},"$1",null,2,0,null,11,"call"],
 $isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 kn:{
-"^":"T53;jJ,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gBV:function(a){return a.jJ},
 sBV:function(a,b){a.jJ=this.ct(a,C.tW,a.jJ,b)},
 gJp:function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gJp.call(this,a)
 return z.gzz()},
-fX:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,17,35],
+fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,17,54],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
 this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,17,11],
@@ -13741,7 +14350,7 @@
 if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
 else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},
 static:{D2:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -13754,12 +14363,12 @@
 C.Mh.ZL(a)
 C.Mh.XI(a)
 return a}}},
-T53:{
+oEY:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":"V32;Uz,HJ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V41;Uz,HJ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gIs:function(a){return a.Uz},
 sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 gnN:function(a){return a.HJ},
@@ -13769,11 +14378,11 @@
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-RB:[function(a,b){J.qA((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gVU",2,0,10,35],
-RF:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gVm",2,0,17,66],
-j9:[function(a,b){J.eg(J.aT(a.Uz)).wM(b)},"$1","gaL",2,0,17,66],
-static:{dI:function(a){var z,y,x,w
-z=$.J1()
+ii:[function(a,b){J.qA((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gVU",2,0,10,54],
+RF:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,17,82],
+j9:[function(a,b){J.y9(J.aT(a.Uz)).wM(b)},"$1","gWp",2,0,17,82],
+static:{TXt:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -13785,7 +14394,7 @@
 C.FH.ZL(a)
 C.FH.XI(a)
 return a}}},
-V32:{
+V41:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
@@ -13871,54 +14480,53 @@
 v.$builtinTypeInfo=[z,w]
 s=new D.vx(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
+case"Socket":s=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+break
 default:z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
 s=new D.vO(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
-bF:function(a){var z
+D5:function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
 return z},
 tg:function(a,b){var z=J.x(a)
 if(!!z.$isvO)return
-if(!!z.$isqC)D.Gf(a,b)
+if(!!z.$isqC)D.yX(a,b)
 else if(!!z.$iswn)D.f3(a,b)},
-Gf:function(a,b){a.aN(0,new D.Qf(a,b))},
+yX:function(a,b){a.aN(0,new D.Qf(a,b))},
 f3:function(a,b){var z,y,x,w,v,u
-for(z=a.Xk,y=0;y<z.length;++y){x=z[y]
+for(z=a.ao,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
 if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
 else u=!1
 if(u)a.u(0,y,b.Qn(x))
 else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},
+else if(v)D.yX(x,b)}},
 af:{
-"^":"Pi;NM@,t7@",
+"^":"Pi;px@,t7@",
 gwv:function(a){var z=this.Jz
 return z.gwv(z)},
 god:function(a){var z=this.Jz
 return z.god(z)},
 gjO:function(a){return this.r0},
 gzS:function(){return this.mQ},
-gPj:function(a){var z,y
-z=this.god(this)
-y=this.r0
-return H.d(z.r0)+"/"+H.d(y)},
+gPj:function(a){return this.Jz.Mq(this.r0)},
 gHP:function(){return"#/"+H.d(this.gPj(this))},
 sHP:function(a){},
-gox:function(a){return this.kT},
+gox:function(a){return this.Sa},
 gUm:function(){return!1},
-gM8:function(){return!1},
-goc:function(a){return this.gNM()},
-soc:function(a,b){this.sNM(this.ct(this,C.YS,this.gNM(),b))},
+gfS:function(){return!1},
+goc:function(a){return this.gpx()},
+soc:function(a,b){this.spx(this.ct(this,C.YS,this.gpx(),b))},
 gzz:function(){return this.gt7()},
 szz:function(a){this.st7(this.ct(this,C.Tc,this.gt7(),a))},
-xW:function(a){if(this.kT)return P.PG(this,null)
+xW:function(a){if(this.Sa)return P.PG(this,null)
 return this.VD(0)},
 VD:function(a){var z
 if(J.xC(this.r0,""))return P.PG(this,null)
-if(this.kT&&this.gM8())return P.PG(this,null)
+if(this.Sa&&this.gfS())return P.PG(this,null)
 z=this.VR
 if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.Pa(this)).wM(new D.jI(this))
 this.VR=z}return z},
@@ -13934,7 +14542,7 @@
 this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Xs:145;a",
+"^":"Tp:163;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -13942,10 +14550,10 @@
 y=this.a
 if(!J.xC(z,y.mQ))return D.hi(y.Jz,a)
 y.eC(a)
-return y},"$1",null,2,0,null,144,"call"],
+return y},"$1",null,2,0,null,162,"call"],
 $isEH:true},
 jI:{
-"^":"Xs:42;b",
+"^":"Tp:64;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 fz:{
@@ -13957,6 +14565,7 @@
 gi2:function(){var z=this.z7
 return z.gUQ(z)},
 gPj:function(a){return H.d(this.r0)},
+Mq:function(a){return H.d(a)},
 gYe:function(){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
@@ -13971,8 +14580,8 @@
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
 return C.xB.yn(x,w+y)},
-jz:function(a){var z,y,x
-z=$.vo().R4(0,a)
+Gn:function(a){var z,y,x
+z=$.Dw().R4(0,a)
 if(z==null)return""
 y=z.QK
 x=y.index
@@ -13981,7 +14590,7 @@
 if(typeof y!=="number")return H.s(y)
 return J.Nj(a,0,x+y)},
 Qn:function(a){throw H.b(P.SY(null))},
-dJ:function(a){var z
+Tn:function(a){var z
 if(a==="")return P.PG(null,null)
 z=this.z7.t(0,a)
 if(z!=null)return P.PG(z,null)
@@ -13993,19 +14602,19 @@
 if(0>=y.length)return H.e(y,0)
 a=y[0]
 z.a=a
-if(J.co(a,"isolates/")){x=this.jz(z.a)
+if(J.co(a,"isolates/")){x=this.Gn(z.a)
 w=this.hV(z.a)
-return this.dJ(x).ml(new D.K7(this,w))}v=this.Qy.t(0,z.a)
+return this.Tn(x).ml(new D.lb(this,w))}v=this.Qy.t(0,z.a)
 if(v!=null)return J.LE(v)
-return this.HL(z.a).ml(new D.lb(z,this))},
-Nw:[function(a,b){return b},"$2","gC9",4,0,51],
+return this.HL(z.a).ml(new D.aEE(z,this))},
+nJ:[function(a,b){return b},"$2","ge1",4,0,67],
 ng:function(a){var z,y,x
 z=null
-try{y=new P.Cf(this.gC9())
+try{y=new P.Cf(this.ge1())
 z=P.jc(a,y.gqa())}catch(x){H.Ru(x)
 return}return R.tB(z)},
 N7:function(a){var z
-if(!D.bF(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
 return P.Vu(D.hi(this,R.tB(z)),null,null)}z=J.U6(a)
 if(J.xC(z.t(a,"type"),"ServiceError"))return P.Vu(D.hi(this,a),null,null)
 else if(J.xC(z.t(a,"type"),"ServiceException"))return P.Vu(D.hi(this,a),null,null)
@@ -14013,7 +14622,7 @@
 HL:function(a){return this.z6(0,a).ml(new D.zA(this)).co(new D.tm(this),new D.mR()).co(new D.bp(this),new D.hc())},
 bF:function(a,b,c){var z,y
 if(c)return
-this.kT=!0
+this.Sa=!0
 z=J.U6(b)
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
@@ -14037,7 +14646,7 @@
 y.u(0,v,u)
 N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.Hq())
 this.z7=y},
-Lw:function(){this.NM=this.ct(this,C.YS,this.NM,"vm")
+md:function(){this.px=this.ct(this,C.YS,this.px,"vm")
 this.t7=this.ct(this,C.Tc,this.t7,"vm")
 this.Qy.u(0,"vm",this)
 var z=P.EF(["id","vm","type","@VM"],null,null)
@@ -14047,32 +14656,32 @@
 "^":"fz+Pi;",
 $isd3:true},
 MZ:{
-"^":"Xs:10;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,94,"call"],
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,109,"call"],
 $isEH:true},
-K7:{
-"^":"Xs:10;b,c",
+lb:{
+"^":"Tp:10;b,c",
 $1:[function(a){var z
 if(a==null)return this.b
 z=this.c
 if(z==null)return J.LE(a)
 else return a.cv(z)},"$1",null,2,0,null,4,"call"],
 $isEH:true},
-lb:{
-"^":"Xs:145;a,d",
+aEE:{
+"^":"Tp:163;a,d",
 $1:[function(a){var z,y
 z=this.d
 y=D.hi(z,a)
-if(y.gUm())z.Qy.to(this.a.a,new D.QZ(y))
-return y},"$1",null,2,0,null,144,"call"],
+if(y.gUm())z.Qy.to(this.a.a,new D.zK(y))
+return y},"$1",null,2,0,null,162,"call"],
 $isEH:true},
-QZ:{
-"^":"Xs:42;e",
+zK:{
+"^":"Tp:64;e",
 $0:function(){return this.e},
 $isEH:true},
 zA:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w
 z=null
 try{z=this.a.ng(a)}catch(x){w=H.Ru(x)
@@ -14080,45 +14689,45 @@
 P.FL("Hit V8 bug.")
 w=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
 w=R.tB(w)
-return P.Vu(D.hi(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,97,"call"],
+return P.Vu(D.hi(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,112,"call"],
 $isEH:true},
 tm:{
-"^":"Xs:10;b",
+"^":"Tp:10;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
 return P.Vu(a,null,null)},"$1",null,2,0,null,21,"call"],
 $isEH:true},
 mR:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 bp:{
-"^":"Xs:10;c",
+"^":"Tp:10;c",
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,59,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,75,"call"],
 $isEH:true},
 hc:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Hq:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){J.LE(b)},
 $isEH:true},
 ER:{
-"^":"a;SP,KE>,wZ",
-eK:function(a){var z,y,x,w,v
-z=this.KE
-H.xr(z,0,a)
+"^":"a;SP,XE>,wZ",
+T1:function(a){var z,y,x,w,v
+z=this.XE
+H.aB(z,0,a)
 for(y=z.length,x=0;x<y;++x){w=this.wZ
 v=z[x]
 if(typeof v!=="number")return H.s(v)
 this.wZ=w+v}},
 y8:function(a,b){var z,y,x,w,v,u,t
-for(z=this.KE,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
+for(z=this.XE,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
 if(v>=w)return H.e(b,v)
 u=J.Hn(u,b[v])
 z[v]=u
@@ -14127,7 +14736,7 @@
 this.wZ=t+u}},
 Vy:function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
-y=this.KE
+y=this.XE
 x=y.length
 w=0
 while(!0){v=z.gB(b)
@@ -14137,10 +14746,10 @@
 if(w>=x)return H.e(y,w)
 y[w]=J.z8(y[w],u)?y[w]:u;++w}},
 CJ:function(){var z,y,x
-for(z=this.KE,y=z.length,x=0;x<y;++x)z[x]=0},
+for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;af<,lI<,h7,yP,hD,RP",
+"^":"a;af<,Fw<,h7,yP,hD,RP",
 gij:function(){return this.h7},
 xZ:function(a,b){var z,y,x,w,v,u
 this.h7=a
@@ -14149,7 +14758,7 @@
 x=this.af
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
 this.RP=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
+for(z=this.hD,x=this.Fw,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
 v.$builtinTypeInfo=[P.KN]
@@ -14160,23 +14769,23 @@
 z.fixed$length=init
 z=new D.ER(0,H.VM(z,[P.KN]),0)
 this.yP=z
-z.eK(y)
+z.T1(y)
 return}z=this.RP
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
 z.fixed$length=init
 u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.y8(y,this.yP.KE)
+u.y8(y,this.yP.XE)
 this.yP.Vy(0,y)
-z=this.lI
+z=this.Fw
 z.push(u)
 if(z.length>this.hD)C.Nm.W4(z,0)}},
 bv:{
-"^":"uz4;V3,Jr,EY,eU,zG,XV,Qy,GH,v9,DC,zb,NM:KT@,t7:PB@,Er,cL,Dr,lP,W1,p2,Hw,vJ,yv,BC<,FF,bj,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+"^":"uz4;V3,Jr,EY,eU,zG,XV,Qy,GH,v9,tW,zb,px:KT@,t7:PB@,Er,cL,Dr,lP,W1,p2,Hw,vJ,mk,BC<,FF,bj,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gwv:function(a){return this.Jz},
 god:function(a){return this},
-gKE:function(a){return this.V3},
-sKE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
+gXE:function(a){return this.V3},
+sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
 gPj:function(a){return this.r0},
 gHP:function(){return"#/"+H.d(this.r0)},
 gBP:function(a){return this.Jr},
@@ -14184,7 +14793,8 @@
 gaj:function(){return this.eU},
 gn0:function(){return this.zG},
 gwg:function(){return this.XV},
-xQ:[function(a){return"#/"+(H.d(this.r0)+"/"+H.d(a))},"$1","gw6",2,0,146,147],
+Mq:function(a){return H.d(this.r0)+"/"+H.d(a)},
+xQ:[function(a){return"#/"+(H.d(this.r0)+"/"+H.d(a))},"$1","gw6",2,0,164,165],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -14192,17 +14802,17 @@
 this.c2()
 this.hr(a,z)
 w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.aU(w,z)},
+if(w!=null)this.BC=this.uY(w,z)},
 c2:function(){var z=this.Qy
-z.gUQ(z).aN(0,new D.Xa())},
+z.gUQ(z).aN(0,new D.Mn())},
 hr: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.mY(y);z.G();){w=z.gl()
 J.UQ(w,"code").eL(w,b,x)}},
-Ms:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gaL",0,0,148],
-cNN:[function(a){J.kH(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,149,150],
+lh:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gWp",0,0,166],
+cNN:[function(a){J.kH(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,167,168],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -14217,7 +14827,7 @@
 return this.Jz.HL(H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
 gVc:function(){return this.v9},
 sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
-gvU:function(){return this.DC},
+gvU:function(){return this.tW},
 gkw:function(){return this.zb},
 goc:function(a){return this.KT},
 soc:function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},
@@ -14230,8 +14840,8 @@
 guq:function(){return this.W1},
 gxs:function(){return this.p2},
 gQB:function(){return this.Hw},
-gkc:function(a){return this.yv},
-skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
+gkc:function(a){return this.mk},
+skc:function(a,b){this.mk=F.Wi(this,C.yh,this.mk,b)},
 bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z=J.U6(b)
 y=z.t(b,"mainPort")
@@ -14241,7 +14851,7 @@
 y=z.t(b,"name")
 this.PB=F.Wi(this,C.Tc,this.PB,y)
 if(c)return
-this.kT=!0
+this.Sa=!0
 this.zG=F.Wi(this,C.DY,this.zG,!1)
 D.tg(b,this)
 if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
@@ -14304,18 +14914,18 @@
 y=this.Jr==null&&z.t(b,"topFrame")==null
 this.eU=F.Wi(this,C.q2,this.eU,y)
 y=z.t(b,"error")
-this.yv=F.Wi(this,C.yh,this.yv,y)
-y=this.DC
+this.mk=F.Wi(this,C.yh,this.mk,y)
+y=this.tW
 y.V1(y)
 for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
 y.XP(y,new D.hU())},
 m7:function(){return this.Jz.HL(H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
-aU:function(a,b){this.FF=0
+uY:function(a,b){this.FF=0
 this.bj=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.tw(b)},
-tw:function(a){var z,y,x,w,v,u,t,s,r,q
+return this.AW(b)},
+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()
@@ -14329,8 +14939,8 @@
 this.FF=z+1
 v=J.UQ(y,z)
 z=[]
-z.$builtinTypeInfo=[D.D5]
-u=new D.D5(w,v,z,0)
+z.$builtinTypeInfo=[D.t9]
+u=new D.t9(w,v,z,0)
 y=this.bj
 t=this.FF
 if(typeof t!=="number")return t.g()
@@ -14338,7 +14948,7 @@
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.tw(a)
+for(;r<s;++r){q=this.AW(a)
 z.push(q)
 y=u.Jv
 t=q.Av
@@ -14349,65 +14959,65 @@
 uz4:{
 "^":"fz+Pi;",
 $isd3:true},
-Xa:{
-"^":"Xs:10;",
+Mn:{
+"^":"Tp:10;",
 $1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
 a.Du=0
 a.fF=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.qH=F.Wi(a,C.uU,a.qH,"")
 C.Nm.sB(a.VS,0)
-C.Nm.sB(a.ci,0)
+C.Nm.sB(a.hw,0)
 a.Oo.V1(0)}},
 $isEH:true},
 Yb:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,151,"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,169,"call"],
 $isEH:true},
 KQ:{
-"^":"Xs:145;a,b",
+"^":"Tp:163;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.hi(z,a)
-if(y.gUm())z.Qy.to(this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,144,"call"],
+if(y.gUm())z.Qy.to(this.b,new D.Ng(y))
+return y},"$1",null,2,0,null,162,"call"],
 $isEH:true},
-Ea:{
-"^":"Xs:42;c",
+Ng:{
+"^":"Tp:64;c",
 $0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,152,"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,170,"call"],
 $isEH:true},
 hU:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return J.oE(J.O6(a),J.O6(b))},
 $isEH:true},
 AP:{
-"^":"Xs:145;a",
+"^":"Tp:163;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.GH
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,111,"call"],
+return y},"$1",null,2,0,null,126,"call"],
 $isEH:true},
 vO:{
-"^":"af;Ce,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+"^":"af;Ce,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gUm:function(){return(J.xC(this.mQ,"Class")||J.xC(this.mQ,"Function")||J.xC(this.mQ,"Field"))&&!J.co(this.r0,$.RQ)},
-gM8:function(){return!1},
+gfS:function(){return!1},
 bu:function(a){return P.vW(this.Ce)},
 bF:function(a,b,c){var z,y,x
-this.kT=!c
+this.Sa=!c
 z=this.Ce
 z.V1(0)
 z.FV(0,b)
 y=z.Zp
 x=y.t(0,"user_name")
-this.NM=this.ct(0,C.YS,this.NM,x)
+this.px=this.ct(0,C.YS,this.px,x)
 y=y.t(0,"name")
 this.t7=this.ct(0,C.Tc,this.t7,y)
 D.tg(z,this.Jz)},
@@ -14426,8 +15036,8 @@
 return z.gUQ(z)},
 gB:function(a){var z=this.Ce.Zp
 return z.gB(z)},
-BN:[function(a){var z=this.Ce
-return z.BN(z)},"$0","gDx",0,0,78],
+HC:[function(a){var z=this.Ce
+return z.HC(z)},"$0","gDx",0,0,94],
 nq:function(a,b){var z=this.Ce
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.Ce,b,c,d)},
@@ -14449,78 +15059,78 @@
 $isd3:true,
 static:{"^":"RQ"}},
 ft:{
-"^":"D3;J6,LD,jo,ZG,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
-gfY:function(a){return this.J6},
-sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+"^":"D3;I0,LD,jo,ZG,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
 bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"message")
 this.LD=F.Wi(this,C.pX,this.LD,y)
 y=this.Jz
 x=D.hi(y,z.t(b,"exception"))
 this.jo=F.Wi(this,C.ne,this.jo,x)
 z=D.hi(y,z.t(b,"stacktrace"))
-this.ZG=F.Wi(this,C.R3,this.ZG,z)
-z="DartError "+H.d(this.J6)
-z=this.ct(this,C.YS,this.NM,z)
-this.NM=z
+this.ZG=F.Wi(this,C.Pf,this.ZG,z)
+z="DartError "+H.d(this.I0)
+z=this.ct(this,C.YS,this.px,z)
+this.px=z
 this.t7=this.ct(this,C.Tc,this.t7,z)}},
 D3:{
 "^":"af+Pi;",
 $isd3:true},
 N7:{
-"^":"wVq;J6,LD,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
-gfY:function(a){return this.J6},
-sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+"^":"wVq;I0,LD,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
 bF:function(a,b,c){var z,y
-this.kT=!0
+this.Sa=!0
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.I0=F.Wi(this,C.Lc,this.I0,y)
 z=z.t(b,"message")
 this.LD=F.Wi(this,C.pX,this.LD,z)
-z="ServiceError "+H.d(this.J6)
-z=this.ct(this,C.YS,this.NM,z)
-this.NM=z
+z="ServiceError "+H.d(this.I0)
+z=this.ct(this,C.YS,this.px,z)
+this.px=z
 this.t7=this.ct(this,C.Tc,this.t7,z)},
 $isN7:true},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 EP:{
-"^":"dZL;J6,LD,IV,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
-gfY:function(a){return this.J6},
-sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+"^":"dZL;I0,LD,IV,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
 gbA:function(a){return this.IV},
 sbA:function(a,b){this.IV=F.Wi(this,C.F3,this.IV,b)},
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"message")
 this.LD=F.Wi(this,C.pX,this.LD,y)
 z=z.t(b,"response")
 this.IV=F.Wi(this,C.F3,this.IV,z)
-z="ServiceException "+H.d(this.J6)
-z=this.ct(this,C.YS,this.NM,z)
-this.NM=z
+z="ServiceException "+H.d(this.I0)
+z=this.ct(this,C.YS,this.px,z)
+this.px=z
 this.t7=this.ct(this,C.Tc,this.t7,z)},
 $isEP:true},
 dZL:{
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":"w8F;dj,Bm<,hp<,DD>,Z3<,mu<,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+"^":"w8F;dj,Bm<,XR<,DD>,Z3<,mu<,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gO3:function(a){return this.dj},
 gUm:function(){return!0},
-gM8:function(){return!1},
+gfS:function(){return!1},
 bF:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=z.t(b,"url")
@@ -14531,19 +15141,19 @@
 v=w.cn(y,"/")
 if(typeof v!=="number")return v.g()
 x=w.yn(y,v+1)}y=z.t(b,"user_name")
-y=this.ct(this,C.YS,this.NM,y)
-this.NM=y
-if(J.FN(y)===!0)this.NM=this.ct(this,C.YS,this.NM,x)
+y=this.ct(this,C.YS,this.px,y)
+this.px=y
+if(J.tx(y)===!0)this.px=this.ct(this,C.YS,this.px,x)
 y=z.t(b,"name")
 this.t7=this.ct(this,C.Tc,this.t7,y)
 if(c)return
-this.kT=!0
+this.Sa=!0
 y=this.Jz
 D.tg(b,y.god(y))
 y=this.Bm
 y.V1(y)
 y.FV(0,z.t(b,"imports"))
-y=this.hp
+y=this.XR
 y.V1(y)
 y.FV(0,z.t(b,"scripts"))
 y=this.DD
@@ -14563,9 +15173,9 @@
 "^":"a;Rd<,a4>",
 $isc2:true},
 vx:{
-"^":"V4b;Gd>,u9<,J6,l9,lx,mB,A1,y6,FB,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
-gfY:function(a){return this.J6},
-sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+"^":"V4b;Gd>,u9<,I0,l9,lx,mB,A1,y6,FB,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 ghY:function(){return this.l9},
 shY:function(a){var z=this.l9
 if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.Gd,z,a)
@@ -14577,17 +15187,17 @@
 z.$builtinTypeInfo=[null]
 this.nq(this,z)}this.lx=a},
 gUm:function(){return!0},
-gM8:function(){return!0},
+gfS:function(){return!0},
 rK:function(a){var z,y
 z=J.Hn(a,1)
-y=this.Gd.Xk
+y=this.Gd.ao
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
 q6:function(a){return this.y6.t(0,a)},
 bF:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"name")
 this.A1=y
 x=J.U6(y)
@@ -14595,10 +15205,10 @@
 if(typeof w!=="number")return w.g()
 w=x.yn(y,w+1)
 this.mB=w
-this.NM=this.ct(this,C.YS,this.NM,w)
+this.px=this.ct(this,C.YS,this.px,w)
 w=this.A1
 this.t7=this.ct(this,C.Tc,this.t7,w)
-this.W8(z.t(b,"source"))
+this.ip(z.t(b,"source"))
 this.PT(z.t(b,"tokenPosTable"))},
 PT:function(a){var z,y,x,w,v,u,t,s,r
 if(a==null)return
@@ -14643,12 +15253,12 @@
 if(!(x<w))break
 y.u(0,z.t(a,x),z.t(a,x+1))
 x+=2}},
-W8:function(a){var z,y,x,w
-this.kT=!1
+ip:function(a){var z,y,x,w
+this.Sa=!1
 if(a==null)return
 z=J.uH(a,"\n")
 if(z.length===0)return
-this.kT=!0
+this.Sa=!0
 y=this.Gd
 y.V1(y)
 N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.A1))
@@ -14662,15 +15272,15 @@
 "^":"a;Yu<,Du<,fF<",
 $isuA:true},
 HJ:{
-"^":"Pi;Yu<,Ix,VF<,Yn,fY>,ar,MT,AP,fn",
+"^":"Pi;Yu<,Ix,VF<,YnP,fY>,ar,MT,AP,fn",
 gIs:function(a){return this.ar},
 sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
 gP3:function(){return this.MT},
-JM:[function(){var z,y
+Nw:[function(){var z,y
 z=this.Ix
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,153],
+return y.bu(z)},"$0","gkA",0,0,171],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -14685,23 +15295,23 @@
 "^":"Pi;Yu<,Fm,L4<,dh,uH<,AP,fn",
 gEB:function(){return this.dh},
 gUB:function(){return J.xC(this.Yu,0)},
-gGf:function(){return this.uH.Xk.length>0},
+gGf:function(){return this.uH.ao.length>0},
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,153],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,171],
 io:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
 if(J.xC(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,154,50],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,172,66],
 HU:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,154,50],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,172,66],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -14718,7 +15328,7 @@
 y=this.eQ()
 x=J.x(y)
 if(x.n(y,0)){P.FL("Could not determine jump address for "+H.d(z))
-return}for(z=a.Xk,w=0;w<z.length;++w){v=z[w]
+return}for(z=a.ao,w=0;w<z.length;++w){v=z[w]
 if(J.xC(v.gYu(),y)){z=this.dh
 if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
@@ -14729,10 +15339,10 @@
 WAE:{
 "^":"a;uX",
 bu:function(a){return this.uX},
-static:{"^":"Oci,bS,WAg,AA,Z7U",CQ:function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,AA,Z7U",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
-else if(z.n(a,"Collected"))return C.WA
+else if(z.n(a,"Collected"))return C.wV
 else if(z.n(a,"Reused"))return C.yP
 else if(z.n(a,"Tag"))return C.Z7
 N.QM("").j2("Unknown code kind "+H.d(a))
@@ -14740,13 +15350,13 @@
 ta:{
 "^":"a;tT>,Av<",
 $ista:true},
-D5:{
+t9:{
 "^":"a;tT>,Av<,ks>,Jv",
-$isD5:true},
+$ist9:true},
 kx:{
-"^":"Zqa;J6,xM,Du<,fF<,Oj,Mb,VS,ci,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
-gfY:function(a){return this.J6},
-sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+"^":"Zqa;I0,xM,Du<,fF<,Oj,Mb,VS,hw,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 glt:function(){return this.xM},
 gS7:function(){return this.mM},
 gan:function(){return this.qH},
@@ -14758,17 +15368,17 @@
 sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
 gYG:function(){return this.MH},
 gUm:function(){return!0},
-gM8:function(){return!0},
+gfS:function(){return!0},
 tx:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","guL",2,0,155,156],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","guL",2,0,173,174],
 OF:function(){if(this.ar!=null)return
-if(!J.xC(this.J6,C.l8))return
+if(!J.xC(this.I0,C.l8))return
 var z=this.MO
 if(z==null)return
 if(J.UQ(z,"script")==null){J.SK(this.MO).ml(new D.Em(this))
 return}J.SK(J.UQ(this.MO,"script")).ml(this.guL())},
-VD:function(a){if(J.xC(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
+VD:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.VD.call(this,this)
 return P.PG(this,null)},
 bd:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
@@ -14787,7 +15397,7 @@
 this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
 this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
 this.bd(this.VS,z.t(a,"callers"),b)
-this.bd(this.ci,z.t(a,"callees"),b)
+this.bd(this.hw,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
 if(y!=null)this.qL(y)
 z=D.Rd(this.fF,this.xM)+" ("+H.d(this.fF)+")"
@@ -14801,7 +15411,7 @@
 y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
 this.MH=F.Wi(this,C.pY,this.MH,y)
 y=D.CQ(z.t(b,"kind"))
-this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.I0=F.Wi(this,C.Lc,this.I0,y)
 this.Oj=H.BU(z.t(b,"start"),16,null)
 this.Mb=H.BU(z.t(b,"end"),16,null)
 y=this.Jz
@@ -14810,15 +15420,15 @@
 y=y.god(y).Qn(z.t(b,"object_pool"))
 this.Ni=F.Wi(this,C.zO,this.Ni,y)
 w=z.t(b,"disassembly")
-if(w!=null)this.zl(w)
+if(w!=null)this.zk(w)
 v=z.t(b,"descriptors")
 if(v!=null)this.WY(J.UQ(v,"members"))
-z=this.va.Xk
-this.kT=z.length!==0||!J.xC(this.J6,C.l8)
-z=z.length!==0&&J.xC(this.J6,C.l8)
+z=this.va.ao
+this.Sa=z.length!==0||!J.xC(this.I0,C.l8)
+z=z.length!==0&&J.xC(this.I0,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
 gUa:function(){return this.TD},
-zl:function(a){var z,y,x,w,v,u,t,s
+zk:function(a){var z,y,x,w,v,u,t,s
 z=this.va
 z.V1(z)
 y=J.U6(a)
@@ -14860,40 +15470,102 @@
 x+=3}},
 tg:function(a,b){J.J5(b,this.Oj)
 return!1},
-gkU:function(){return J.xC(this.J6,C.l8)},
+gkU:function(){return J.xC(this.I0,C.l8)},
 $iskx:true,
 static:{Rd:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Xs:10;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.guL())},"$1",null,2,0,null,157,"call"],
+J.SK(y).ml(z.guL())},"$1",null,2,0,null,175,"call"],
 $isEH:true},
 fx:{
-"^":"Xs:51;",
+"^":"Tp:67;",
 $2:function(a,b){return J.Hn(b.gAv(),a.gAv())},
 $isEH:true},
+l8R:{
+"^":"a;uX",
+bu:function(a){return this.uX},
+static:{"^":"Zt,lTU,FJy,wjk",Fs:function(a){var z=J.x(a)
+if(z.n(a,"Listening"))return C.Cn
+else if(z.n(a,"Normal"))return C.qp
+else if(z.n(a,"Pipe"))return C.FJ
+else if(z.n(a,"Internal"))return C.wj
+N.QM("").j2("Unknown socket kind "+H.d(a))
+throw H.b(P.a9())}}},
+WP:{
+"^":"D3i;V8@,je,mU,I0,vud,DB,XK,vO,L7,zw,tO,HO,kJ,EC,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gUm:function(){return!0},
+gHY:function(){return J.xC(this.I0,C.FJ)},
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
+gyv:function(a){return this.vud},
+gm8:function(){return this.DB},
+gaU:function(){return this.XK},
+gaP:function(){return this.vO},
+gzM:function(){return this.L7},
+gkE:function(){return this.zw},
+giP:function(){return this.tO},
+gLw:function(){return this.HO},
+gNS:function(){return this.kJ},
+guh:function(){return this.EC},
+bF:function(a,b,c){var z,y
+z=J.U6(b)
+y=z.t(b,"name")
+this.px=this.ct(this,C.YS,this.px,y)
+y=z.t(b,"name")
+this.t7=this.ct(this,C.Tc,this.t7,y)
+y=D.Fs(z.t(b,"kind"))
+this.I0=F.Wi(this,C.Lc,this.I0,y)
+if(c)return
+this.Sa=!0
+y=this.Jz
+D.tg(b,y.god(y))
+y=z.t(b,"readClosed")
+this.DB=F.Wi(this,C.I7,this.DB,y)
+y=z.t(b,"writeClosed")
+this.XK=F.Wi(this,C.Uy,this.XK,y)
+y=z.t(b,"closing")
+this.vO=F.Wi(this,C.To,this.vO,y)
+y=z.t(b,"listening")
+this.L7=F.Wi(this,C.cc,this.L7,y)
+y=z.t(b,"protocol")
+this.vud=F.Wi(this,C.AY,this.vud,y)
+y=z.t(b,"localAddress")
+this.tO=F.Wi(this,C.Lx,this.tO,y)
+y=z.t(b,"localPort")
+this.HO=F.Wi(this,C.M3,this.HO,y)
+y=z.t(b,"remoteAddress")
+this.kJ=F.Wi(this,C.yL,this.kJ,y)
+y=z.t(b,"remotePort")
+this.EC=F.Wi(this,C.ni,this.EC,y)
+y=z.t(b,"fd")
+this.zw=F.Wi(this,C.R3,this.zw,y)
+this.V8=z.t(b,"owner")}},
+D3i:{
+"^":"af+Pi;",
+$isd3:true},
 Qf:{
-"^":"Xs:51;a,b",
+"^":"Tp:67;a,b",
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
-if(y&&D.bF(b))this.a.u(0,a,this.b.Qn(b))
+if(y&&D.D5(b))this.a.u(0,a,this.b.Qn(b))
 else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},
+else if(y)D.yX(b,this.b)},
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
 zM:{
-"^":"V33;MK,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gkc:function(a){return a.MK},
-skc:function(a,b){a.MK=this.ct(a,C.yh,a.MK,b)},
+"^":"V42;xT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gkc:function(a){return a.xT},
+skc:function(a,b){a.xT=this.ct(a,C.yh,a.xT,b)},
 static:{cE:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -14904,16 +15576,16 @@
 C.SX.ZL(a)
 C.SX.XI(a)
 return a}}},
-V33:{
+V42:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 Rk:{
-"^":"V34;Xc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V43;Xc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gja:function(a){return a.Xc},
 sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
-static:{ma:function(a){var z,y,x,w
-z=$.J1()
+static:{dP:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -14921,15 +15593,15 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.Vd.ZL(a)
-C.Vd.XI(a)
+C.ZJ.ZL(a)
+C.ZJ.XI(a)
 return a}}},
-V34:{
+V43:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":"wv;Jf,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+"^":"wv;Jf,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 z6:function(a,b){var z
 N.QM("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
@@ -14937,15 +15609,15 @@
 return W.It(J.ew(z,b),null,null).OA(new U.dT())},
 SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
 dT:{
-"^":"Xs:10;",
+"^":"Tp:10;",
 $1:[function(a){var z
 N.QM("").YX("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.zc.KP(P.EF(["type","ServiceException","id","","response",J.lN(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,21,"call"],
+return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.Du(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,21,"call"],
 $isEH:true},
 bl:{
-"^":"wv;ba,yb,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+"^":"wv;ba,yb,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 q3:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -14955,7 +15627,7 @@
 z=this.ba
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,17,158],
+J.KD(v,w)},"$1","gVx",2,0,17,176],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -14964,14 +15636,14 @@
 y.u(0,"query","/"+H.d(b));++this.yb
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.ba.u(0,z,x)
-J.vI(W.Pv(window.parent),C.zc.KP(y),"*")
+J.vI(W.Pv(window.parent),C.xr.KP(y),"*")
 return x.MM},
 PI:function(){var z=H.VM(new W.RO(window,C.ph.Ph,!1),[null])
 H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
 N.QM("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 Ti:{
-"^":"V35;Ll,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V44;Ll,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
 Xq:function(a){var z
@@ -14993,8 +15665,11 @@
 case"Field":z=W.r3("field-view",null)
 J.JZ(z,a.Ll)
 return z
+case"FlagList":z=W.r3("flag-list",null)
+J.GF(z,a.Ll)
+return z
 case"Function":z=W.r3("function-view",null)
-J.Mu(z,a.Ll)
+J.C3(z,a.Ll)
 return z
 case"HeapMap":z=W.r3("heap-map",null)
 J.Nf(z,a.Ll)
@@ -15011,15 +15686,39 @@
 case"HttpServer":z=W.r3("io-http-server-view",null)
 J.fb(z,a.Ll)
 return z
+case"SocketList":z=W.r3("io-socket-list-view",null)
+J.A4(z,a.Ll)
+return z
+case"Socket":z=W.r3("io-socket-view",null)
+J.Cu(z,a.Ll)
+return z
+case"WebSocketList":z=W.r3("io-web-socket-list-view",null)
+J.A4(z,a.Ll)
+return z
+case"WebSocket":z=W.r3("io-web-socket-view",null)
+J.tH(z,a.Ll)
+return z
 case"Isolate":z=W.r3("isolate-view",null)
 J.uM(z,a.Ll)
 return z
 case"Library":z=W.r3("library-view",null)
 J.cl(z,a.Ll)
 return z
+case"ProcessList":z=W.r3("io-process-list-view",null)
+J.A4(z,a.Ll)
+return z
+case"Process":z=W.r3("io-process-view",null)
+J.aw(z,a.Ll)
+return z
 case"Profile":z=W.r3("isolate-profile",null)
 J.CJ(z,a.Ll)
 return z
+case"RandomAccessFileList":z=W.r3("io-random-access-file-list-view",null)
+J.A4(z,a.Ll)
+return z
+case"RandomAccessFile":z=W.r3("io-random-access-file-view",null)
+J.fR(z,a.Ll)
+return z
 case"ServiceError":z=W.r3("service-error-view",null)
 J.Qr(z,a.Ll)
 return z
@@ -15046,9 +15745,9 @@
 x=this.Xq(a)
 if(x==null){N.QM("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,10,35],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,10,54],
 static:{lv:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -15056,10 +15755,10 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.th.ZL(a)
-C.th.XI(a)
+C.Ns.ZL(a)
+C.Ns.XI(a)
 return a}}},
-V35:{
+V44:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
@@ -15072,7 +15771,7 @@
 Qj:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
 this.ct(a,C.pu,0,1)
-this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,17,35],
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,17,54],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 return z.gHP()},
@@ -15082,9 +15781,9 @@
 goc:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 return J.O6(z)},
-gWw:function(a){return J.FN(this.goc(a))},
+gWw:function(a){return J.tx(this.goc(a))},
 static:{lK:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -15093,25 +15792,25 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.HR.ZL(a)
-C.HR.XI(a)
+C.wU.ZL(a)
+C.wU.XI(a)
 return a}}},
 pv:{
 "^":"uL+Pi;",
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
 CY:{
-"^":"Xfs;wG,IK,bP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gd4:function(a){return a.wG},
-sd4:function(a,b){a.wG=this.ct(a,C.bk,a.wG,b)},
+"^":"KAf;kF,IK,bP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gd4:function(a){return a.kF},
+sd4:function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},
 gEu:function(a){return a.IK},
 sEu:function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
-XF:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.wG=this.ct(a,C.bk,a.wG,z)},"$3","gQU",6,0,70,1,159,72],
+RC:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,86,1,177,88],
 static:{Al:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -15122,16 +15821,16 @@
 C.Yo.ZL(a)
 C.Yo.XI(a)
 return a}}},
-Xfs:{
+KAf:{
 "^":"ir+Pi;",
 $isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
 "^":"",
 Wq:{
-"^":"a;c1,BH,Mg,QR,ER,Ja,MR,tu",
+"^":"a;wq,BH,Mg,QR,ER,Ja,MR,tu",
 WO:function(a,b){return this.tu.$1(b)},
 bu:function(a){var z=P.p9("")
 z.KF("(options:")
-z.KF(this.c1?"fields ":"")
+z.KF(this.wq?"fields ":"")
 z.KF(this.BH?"properties ":"")
 z.KF(this.Ja?"methods ":"")
 z.KF(this.Mg?"inherited ":"_")
@@ -15142,7 +15841,7 @@
 return z.vM}},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
-gHO:function(){return this.fY===C.nU},
+gZI:function(){return this.fY===C.nU},
 gUd:function(){return this.fY===C.BM},
 gUA:function(){return this.fY===C.it},
 giO:function(a){var z=this.oc
@@ -15182,9 +15881,9 @@
 for(;x.G();){v=x.lo
 if(w.n(y,v))return!0
 if(!!J.x(v).$isuq){u=w.gbx(y)
-u=$.yQ().aG(u,v)}else u=!1
+u=$.mX().aG(u,v)}else u=!1
 if(u)return!0}}return!1},
-Lx:function(a){var z,y
+OS:function(a){var z,y
 z=H.G3()
 y=H.KT(z).BD(a)
 if(y)return 0
@@ -15195,7 +15894,7 @@
 z=H.KT(z,[z,z,z]).BD(a)
 if(z)return 3
 return 4},
-aW:function(a){var z,y
+Zpg:function(a){var z,y
 z=H.G3()
 y=H.KT(z,[z,z,z]).BD(a)
 if(y)return 3
@@ -15219,54 +15918,54 @@
 kP:function(){throw H.b(P.FM("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["smoke.static","package:smoke/static.dart",,O,{
 "^":"",
 Oj:{
-"^":"a;tO,F8,lk,BJ,fu,af<,yQ"},
+"^":"a;LH,QD,lk,of,fu,af<,yQ"},
 LT:{
-"^":"a;Gu,Gl,N5",
-jD:function(a,b){var z=this.Gu.t(0,b)
+"^":"a;eA,vk,X9",
+jD:function(a,b){var z=this.eA.t(0,b)
 if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(a)},
-Cq:function(a,b,c){var z=this.Gl.t(0,b)
+Cq:function(a,b,c){var z=this.vk.t(0,b)
 if(z==null)throw H.b(O.lA("setter \""+H.d(b)+"\" in "+H.d(a)))
 z.$2(a,c)},
 Ck:function(a,b,c,d,e){var z,y,x,w,v,u,t
 z=null
-if(!!J.x(a).$isuq){this.N5.t(0,a)
-z=null}else{x=this.Gu.t(0,b)
+if(!!J.x(a).$isuq){this.X9.t(0,a)
+z=null}else{x=this.eA.t(0,b)
 z=x==null?null:x.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){w=X.Lx(z)
+if(d){w=X.OS(z)
 if(w>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
-c=X.Na(c,w,P.y(w,J.q8(c)))}else{v=X.aW(z)
+c=X.Na(c,w,P.y(w,J.q8(c)))}else{v=X.Zpg(z)
 u=v>=0?v:J.q8(c)
 c=X.Na(c,w,u)}}try{u=H.im(z,c,P.Te(null))
-return u}catch(t){if(!!J.x(H.Ru(t)).$ismp){if(y!=null)P.FL(y)
+return u}catch(t){if(!!J.x(H.Ru(t)).$isJS){if(y!=null)P.FL(y)
 throw t}else throw t}}},
 bY:{
-"^":"a;Mp,Cu,u4",
+"^":"a;TB,WF,ad",
 aG:function(a,b){var z,y,x
 if(a.n(0,b)||b.n(0,C.FQ))return!0
-for(z=this.Mp;!J.xC(a,C.FQ);a=y){y=z.t(0,a)
+for(z=this.TB;!J.xC(a,C.FQ);a=y){y=z.t(0,a)
 x=J.x(y)
 if(x.n(y,b))return!0
-if(y==null){if(!this.u4)return!1
+if(y==null){if(!this.ad)return!1
 throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
-UK:function(a,b){var z=this.Qk(a,b)
+UK:function(a,b){var z=this.F1(a,b)
 return z!=null&&z.fY===C.it&&!z.Fo},
 n6:function(a,b){var z,y
-z=this.Cu.t(0,a)
-if(z==null){if(!this.u4)return!1
+z=this.WF.t(0,a)
+if(z==null){if(!this.ad)return!1
 throw H.b(O.lA("declarations for "+H.d(a)))}y=z.t(0,b)
 return y!=null&&y.fY===C.it&&y.Fo},
-CV:function(a,b){var z=this.Qk(a,b)
-if(z==null){if(!this.u4)return
+CV:function(a,b){var z=this.F1(a,b)
+if(z==null){if(!this.ad)return
 throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
 Me:function(a,b,c){var z,y,x,w,v,u
 z=[]
-if(c.Mg){y=this.Mp.t(0,b)
-if(y==null){if(this.u4)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.QR))z=this.Me(0,y,c)}x=this.Cu.t(0,b)
-if(x==null){if(!this.u4)return z
+if(c.Mg){y=this.TB.t(0,b)
+if(y==null){if(this.ad)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.QR))z=this.Me(0,y,c)}x=this.WF.t(0,b)
+if(x==null){if(!this.ad)return z
 throw H.b(O.lA("declarations for "+H.d(b)))}for(w=J.mY(x.gUQ(x));w.G();){v=w.gl()
-if(!c.c1&&v.gHO())continue
+if(!c.wq&&v.gZI())continue
 if(!c.BH&&v.gUd())continue
 if(c.ER&&J.ql(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
@@ -15274,33 +15973,33 @@
 u=c.MR
 if(u!=null&&!X.ZO(v.gDv(),u))continue
 z.push(v)}return z},
-Qk:function(a,b){var z,y,x,w,v
-for(z=this.Mp,y=this.Cu;!J.xC(a,C.FQ);a=v){x=y.t(0,a)
+F1:function(a,b){var z,y,x,w,v
+for(z=this.TB,y=this.WF;!J.xC(a,C.FQ);a=v){x=y.t(0,a)
 if(x!=null){w=x.t(0,b)
 if(w!=null)return w}v=z.t(0,a)
-if(v==null){if(!this.u4)return
+if(v==null){if(!this.ad)return
 throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
 ut:{
-"^":"a;eB,d8",
-Ut:function(a){this.eB.aN(0,new O.Fi(this))},
+"^":"a;ep,I1",
+Ut:function(a){this.ep.aN(0,new O.Fi(this))},
 static:{ty:function(a){var z=new O.ut(a.af,P.Fl(null,null))
 z.Ut(a)
 return z}}},
 Fi:{
-"^":"Xs:51;a",
-$2:function(a,b){this.a.d8.u(0,b,a)},
+"^":"Tp:67;a",
+$2:function(a,b){this.a.I1.u(0,b,a)},
 $isEH:true},
 tk:{
-"^":"a;uh",
-bu:function(a){return"Missing "+this.uh+". Code generation for the smoke package seems incomplete."},
+"^":"a;GB",
+bu:function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},
 static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":"V36;xP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V45;xP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
-static:{an:function(a){var z,y,x,w
-z=$.J1()
+static:{qa:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -15311,17 +16010,17 @@
 C.dX.ZL(a)
 C.dX.XI(a)
 return a}}},
-V36:{
+V45:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uw:{
-"^":"V37;ju,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V46;ju,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gtN:function(a){return a.ju},
 stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-RF:[function(a,b){J.LE(a.ju).wM(b)},"$1","gVm",2,0,17,66],
-static:{bV:function(a){var z,y,x,w
-z=$.J1()
+RF:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,17,82],
+static:{HI:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -15332,7 +16031,7 @@
 C.wB.ZL(a)
 C.wB.XI(a)
 return a}}},
-V37:{
+V46:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
@@ -15354,7 +16053,7 @@
 return z},
 X7:function(a,b,c,d,e,f,g,h){var z,y,x,w
 z=b.appendChild(J.Lh(c,a,!1))
-for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.X7(y,z,c,x?d.JW(w):null,e,f,g,null)
+for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.X7(y,z,c,x?d.QE(w):null,e,f,g,null)
 if(d.ghK()){M.Ky(z).bt(a)
 if(f!=null)M.Ky(z).szH(f)}M.mV(z,d,e,g)
 return z},
@@ -15364,12 +16063,12 @@
 else{y=$.rf()
 y.toString
 x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.J4())
+w=x==null?null:H.of(x,y.Qz())
 if(w==null)break
 a=w}}y=J.x(a)
 if(!!y.$isQF||!!y.$isI0||!!y.$ishy)return a
 return},
-aU:function(a){var z
+Ci:function(a){var z
 for(;z=J.RE(a),z.gBy(a)!=null;)a=z.gBy(a)
 return $.rf().t(0,a)!=null?a:null},
 H4:function(a,b,c){if(c==null)return
@@ -15385,7 +16084,7 @@
 F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
-y=M.wR(a)
+y=M.RI(a)
 new W.E9(a).aN(0,new M.NW(z,a,b,y))
 if(y){x=z.a
 if(x==null){w=[]
@@ -15426,10 +16125,10 @@
 x=!!J.x(x).$isTv?x:L.hk(x)
 w=$.ps
 $.ps=w+1
-y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.cc(y,b.gcK(),null,null,null)}x=$.ps
+y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.Qw(y,b.gcK(),null,null,null)}x=$.ps
 $.ps=x+1
 y=new L.NV(null,[],x,null,null,null)
-y.Hy=[]
+y.Wf=[]
 x=J.U6(b)
 v=0
 while(!0){w=x.gB(b)
@@ -15439,13 +16138,13 @@
 z=b.HH(v)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
-else{if(y.xX!=null||y.Bg==null)H.vh(P.w("Cannot add observers once started."))
-J.mu(t,y.gQ8())
-w=y.Bg
+else{if(y.GX!=null||y.TV==null)H.vh(P.w("Cannot add observers once started."))
+J.mu(t,y.gjM())
+w=y.TV
 w.push(C.dV)
 w.push(t)}break c$0}s=b.Pn(v)
 if(u===!0)y.ti(s.Tl(d))
-else y.yN(d,s)}++v}return new Y.cc(y,b.gcK(),null,null,null)},
+else y.yN(d,s)}++v}return new Y.Qw(y,b.gcK(),null,null,null)},
 mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.RE(b)
 y=z.gCd(b)
@@ -15463,20 +16162,20 @@
 z=$.cm()
 z.toString
 y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.J4())
+x=y==null?null:H.of(y,z.Qz())
 if(x!=null)return x
 w=J.x(a)
 if(!!w.$isJK)x=new M.ee(a,null,null)
 else if(!!w.$isbs)x=new M.ug(a,null,null)
-else if(!!w.$isAE)x=new M.wl(a,null,null)
-else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+else if(!!w.$isAE)x=new M.VT(a,null,null)
+else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!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=!!w.$isUn?new M.XT(a,null,null):new M.vy(a,null,null)
 z.u(0,a,x)
 return x},
-wR:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+RI:function(a){var z=J.x(a)
+if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
 else z=!0
 else z=!0
 else z=!1
@@ -15486,20 +16185,20 @@
 nR:function(a,b,c,d){var z,y,x,w,v,u
 z={}
 z.a=b
-J.SB(this.gPP(),z.a)
+J.n1(this.gPP(),z.a)
 y=this.grF()
 x=J.x(y)
-w=!!x.$isUC&&J.xC(z.a,"value")
+w=!!x.$isEa&&J.xC(z.a,"value")
 v=z.a
 if(w){new W.E9(y).Rz(0,v)
 if(d)return this.nD(c)
 x=this.ge2()
-x.$1(J.mu(c,x))}else{u=J.Is(v,"?")
+x.$1(J.mu(c,x))}else{u=J.RY(v,"?")
 if(u){x.gQg(y).Rz(0,z.a)
 x=z.a
 w=J.U6(x)
 z.a=w.Nj(x,0,J.Hn(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
-x=new M.BL(z,this,u)
+x=new M.WF(z,this,u)
 x.$1(J.mu(c,x))}this.gCd(this).u(0,z.a,c)
 return c},
 nD:[function(a){var z,y,x,w,v,u,t
@@ -15513,14 +16212,14 @@
 t=null}}else{u=null
 t=null}y.sP(z,a==null?"":H.d(a))
 if(t!=null&&!J.xC(w.gP(x),u)){y=w.gP(x)
-J.Fc(t.gvt(),y)}},"$1","ge2",2,0,17,36]},
-BL:{
-"^":"Xs:10;a,b,c",
-$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,160,"call"],
+J.Fc(t.gvt(),y)}},"$1","ge2",2,0,17,55]},
+WF:{
+"^":"Tp:10;a,b,c",
+$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,137,"call"],
 $isEH:true},
 b2:{
 "^":"Ap;rF<,E3,vt<,jS",
-HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","gfM",2,0,17,36],
+HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","gfM",2,0,17,55],
 Uh:[function(a){var z,y,x,w,v
 switch(this.jS){case"value":z=J.Vm(this.rF)
 J.Fc(this.vt,z)
@@ -15532,17 +16231,17 @@
 if(!!y.$isJK&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
 v=J.UQ(J.QE(!!J.x(w).$isvy?w:M.Ky(w)),"checked")
 if(v!=null)J.Fc(v,!1)}break
-case"selectedIndex":z=J.fa(this.rF)
+case"selectedIndex":z=J.Lr(this.rF)
 J.Fc(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,17,1],
+break}O.wR()},"$1","gCL",2,0,17,1],
 TR:function(a,b){return J.mu(this.vt,b)},
 gP:function(a){return J.Vm(this.vt)},
 sP:function(a,b){J.Fc(this.vt,b)
 return b},
-xO:function(a){var z=this.E3
+S6:function(a){var z=this.E3
 if(z!=null){z.ed()
 this.E3=null}z=this.vt
-if(z!=null){J.yd(z)
+if(z!=null){J.x0(z)
 this.vt=null}},
 $isb2:true,
 static:{"^":"S8",pw:function(a,b,c){switch(c){case"checked":J.Ae(a,null!=b&&!1!==b)
@@ -15551,7 +16250,7 @@
 return
 case"value":J.Fc(a,b==null?"":H.d(b))
 return}},IP:function(a){var z=J.x(a)
-if(!!z.$isUC)return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])
+if(!!z.$isEa)return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])
 switch(z.gt5(a)){case"checkbox":return $.FF().LX(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
 default:return z.gLm(a)}},pt:function(a){var z,y,x
@@ -15559,13 +16258,13 @@
 if(z.gMB(a)!=null){z=z.gMB(a)
 z.toString
 z=new W.wi(z)
-return z.ev(z,new M.WP(a))}else{y=M.bM(a)
+return z.ev(z,new M.iA(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.iA(a))}},bC:function(a){if(typeof a==="string")return H.BU(a,null,new M.fR())
+return x.ev(x,new M.qx(a))}},bC:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
 return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 YJG:{
-"^":"Xs:42;",
+"^":"Tp:64;",
 $0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -15579,18 +16278,18 @@
 v=document.createEvent("MouseEvent")
 J.Dh(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.U3:C.Nm.gtH(x)},
+return x.length===1?C.U3:C.Nm.geK(x)},
 $isEH:true},
 pp:{
-"^":"Xs:10;a",
-$1:[function(a){this.a.push(C.pi)},"$1",null,2,0,null,1,"call"],
+"^":"Tp:10;a",
+$1:[function(a){this.a.push(C.nI)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 ik:{
-"^":"Xs:10;b",
+"^":"Tp:10;b",
 $1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-WP:{
-"^":"Xs:10;a",
+iA:{
+"^":"Tp:10;a",
 $1:function(a){var z,y
 z=this.a
 y=J.x(a)
@@ -15601,13 +16300,13 @@
 else z=!1
 return z},
 $isEH:true},
-iA:{
-"^":"Xs:10;b",
+qx:{
+"^":"Tp:10;b",
 $1:function(a){var z=J.x(a)
 return!z.n(a,this.b)&&z.gMB(a)==null},
 $isEH:true},
-fR:{
-"^":"Xs:10;",
+LG:{
+"^":"Tp:10;",
 $1:function(a){return 0},
 $isEH:true},
 ee:{
@@ -15618,7 +16317,7 @@
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.nR.call(this,this,b,c,d)
 J.Vs(this.rF).Rz(0,b)
 if(d){M.pw(this.rF,c,b)
-return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
+return}J.n1(!!J.x(this.grF()).$isvy?this.grF():this,b)
 z=this.gCd(this)
 y=this.rF
 x=new M.b2(y,null,c,b)
@@ -15630,7 +16329,7 @@
 XI:{
 "^":"a;Cd>,ks>,jb>",
 ghK:function(){return!1},
-JW:function(a){var z=this.ks
+QE:function(a){var z=this.ks
 if(z==null||a>=z.length)return
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
@@ -15645,14 +16344,14 @@
 z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+d
 if(typeof console!="undefined")console.error(z)
 return},
-Yj:function(a,b){var z
+Mh:function(a,b){var z
 if(this.u2==null)return
 z=this.gCd(this).Rz(0,b)
-if(z!=null)J.yd(z)},
-GB:function(a){var z,y
+if(z!=null)J.x0(z)},
+BM:function(a){var z,y
 if(this.u2==null)return
 for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(y!=null)J.yd(y)}this.u2=null},
+if(y!=null)J.x0(y)}this.u2=null},
 gCd:function(a){var z=this.u2
 if(z==null){z=P.L5(null,null,null,P.qU,A.Ap)
 this.u2=z}return z},
@@ -15669,7 +16368,7 @@
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
 J.Vs(this.rF).Rz(0,b)
 if(d){M.pw(this.rF,c,b)
-return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
+return}J.n1(!!J.x(this.grF()).$isvy?this.grF():this,b)
 z=this.gCd(this)
 y=this.rF
 x=new M.b2(y,null,c,b)
@@ -15679,21 +16378,21 @@
 z.u(0,b,x)
 return x}},
 DT:{
-"^":"V2;Q2?,nF,os<,xU,q4?,Bx?,M5?,AD,VZ,rF,u2,Vw",
+"^":"V2;Q2?,nF,os<,xU,q4?,IO?,M5?,AD,VZ,rF,u2,Vw",
 grF:function(){return this.rF},
 gPP:function(){return!!J.x(this.rF).$isDT?this.rF:this},
 oq:function(a){var z,y
 z=this.os
-if(z!=null)z.x5()
+if(z!=null)z.NC()
 if(a.qd==null&&a.DK==null&&a.wA==null){z=this.os
-if(z!=null){z.xO(0)
+if(z!=null){z.S6(0)
 this.os=null
 this.gCd(this).Rz(0,"iterator")}return}if(this.os==null){z=this.gCd(this)
 y=new M.TG(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
 this.os=y
 z.u(0,"iterator",y)}this.os.dE(a,this.Q2)
 return this.os},
-a5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+dI:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z=this.gnv(this)
 y=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
 x=this.VZ
@@ -15710,11 +16409,11 @@
 z=v}u=J.O2(z)
 $.rf().u(0,u,this.rF)
 t=new M.bX(a,null,null)
-for(s=J.LY(y),z=x!=null,r=0;s!=null;s=s.nextSibling,++r){q=z?x.JW(r):null
+for(s=J.LY(y),z=x!=null,r=0;s!=null;s=s.nextSibling,++r){q=z?x.QE(r):null
 M.Ky(M.X7(s,u,this.AD,q,a,b,c,null)).sVw(t)}t.EA=u.firstChild
 t.Po=u.lastChild
 return u},
-ZK:function(a,b){return this.a5(a,b,null)},
+ZK:function(a,b){return this.dI(a,b,null)},
 gzH:function(){return this.nF},
 szH:function(a){var z
 this.nF=a
@@ -15728,28 +16427,28 @@
 z=J.Vs(this.rF).MW.getAttribute("ref")
 if(z!=null){y=M.bM(this.rF)
 x=y!=null?J.Vr(y,z):null
-if(x==null){w=M.aU(this.rF)
-if(w!=null)x=J.c1(w,"#"+z)}}else x=null
+if(x==null){w=M.Ci(this.rF)
+if(w!=null)x=J.Eh(w,"#"+z)}}else x=null
 if(x==null){x=this.q4
 if(x==null)return this.rF}v=J.Gc(!!J.x(x).$isvy?x:M.Ky(x))
 return v!=null?v:x},
 gjb:function(a){var z
 this.GC()
-z=this.Bx
-return z!=null?z:H.Go(this.rF,"$isyY").content},
+z=this.IO
+return z!=null?z:H.Go(this.rF,"$isOH").content},
 bt:function(a){var z,y,x,w,v,u,t
 if(this.M5===!0)return!1
 M.oR()
 this.M5=!0
-z=!!J.x(this.rF).$isyY
+z=!!J.x(this.rF).$isOH
 y=!z
 if(y){x=this.rF
 w=J.RE(x)
-if(w.gQg(x).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
-v=M.iR(this.rF)
+if(w.gQg(x).MW.hasAttribute("template")===!0&&C.z5.x4(w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+v=M.pZ(this.rF)
 v=!!J.x(v).$isvy?v:M.Ky(v)
 v.sM5(!0)
-z=!!J.x(v.grF()).$isyY
+z=!!J.x(v.grF()).$isOH
 u=!0}else{x=this.rF
 w=J.RE(x)
 if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.rF
@@ -15762,22 +16461,22 @@
 w.zB(x)
 v=!!J.x(t).$isvy?t:M.Ky(t)
 v.sM5(!0)
-z=!!J.x(v.grF()).$isyY}else{v=this
+z=!!J.x(v.grF()).$isOH}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sBx(J.O2(M.TA(v.grF())))
+u=!1}if(!z)v.sIO(J.O2(M.TA(v.grF())))
 if(a!=null)v.sq4(a)
 else if(y)M.KE(v,this.rF,u)
 else M.GM(J.NQ(v))
 return!0},
 GC:function(){return this.bt(null)},
 $isDT:true,
-static:{"^":"mn,EW,Sf,vU",TA:function(a){var z,y,x,w
+static:{"^":"mn,EW,Qn,vU",TA:function(a){var z,y,x,w
 z=J.Do(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},iR:function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},pZ:function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gBy(a).insertBefore(y,a)
@@ -15796,27 +16495,27 @@
 if(c){J.y2(z,b)
 return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
 z=new M.CE()
-y=J.MK(a,$.cz())
-if(M.wR(a))z.$1(a)
+y=J.MK(a,$.i8())
+if(M.RI(a))z.$1(a)
 y.aN(y,z)},oR:function(){if($.vU===!0)return
 $.vU=!0
 var z=document.createElement("style",null)
-J.t3(z,H.d($.cz())+" { display: none; }")
+J.t3(z,H.d($.i8())+" { display: none; }")
 document.head.appendChild(z)}}},
 CE:{
-"^":"Xs:17;",
+"^":"Tp:17;",
 $1:function(a){if(!M.Ky(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.Ky(a)))},
 $isEH:true},
 W6o:{
-"^":"Xs:10;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,137,"call"],
+"^":"Tp:10;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 aR:{
-"^":"Xs:10;a,b,c",
+"^":"Tp:10;a,b,c",
 $1:function(a){return this.c.pm(a,this.a,this.b)},
 $isEH:true},
 NW:{
-"^":"Xs:51;a,b,c,d",
+"^":"Tp:67;a,b,c,d",
 $2:function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.xC(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
@@ -15832,30 +16531,30 @@
 z.push(y)}},
 $isEH:true},
 TG:{
-"^":"Ap;YS,SU,vy,S6,Jh,WI,bn,D2,ts,qe,ur,VC,Wv,eY,jq",
+"^":"Ap;YS,SU,vy,lS,Jh,WI,bn,D2,Ee,qe,ur,VC,Wv,eY,jq",
 RV:function(a){return this.eY.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
 gP:function(a){return this.bn},
-x5:function(){var z,y
+NC:function(){var z,y
 z=this.WI
 y=J.x(z)
-if(!!y.$isAp){y.xO(z)
+if(!!y.$isAp){y.S6(z)
 this.WI=null}z=this.bn
 y=J.x(z)
-if(!!y.$isAp){y.xO(z)
+if(!!y.$isAp){y.S6(z)
 this.bn=null}},
 dE:function(a,b){var z,y,x
-this.x5()
+this.NC()
 z=this.YS.rF
 y=a.qd
 x=y!=null
 this.D2=x
-this.ts=a.wA!=null
+this.Ee=a.wA!=null
 if(x){this.qe=y.eq
 y=M.GZ("if",y,z,b)
 this.WI=y
 if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
-return}}else H.Go(y,"$isAp").TR(0,this.goo())}if(this.ts===!0){y=a.wA
+return}}else H.Go(y,"$isAp").TR(0,this.goo())}if(this.Ee===!0){y=a.wA
 this.ur=y.eq
 y=M.GZ("repeat",y,z,b)
 this.bn=y}else{y=a.DK
@@ -15869,34 +16568,34 @@
 z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
 return}}y=this.bn
 if(this.ur!==!0){H.Go(y,"$isAp")
-y=y.gP(y)}this.Io(this.ts!==!0?[y]:y)},"$1","goo",2,0,17,11],
+y=y.gP(y)}this.Io(this.Ee!==!0?[y]:y)},"$1","goo",2,0,17,11],
 Io:function(a){var z,y
 z=J.x(a)
-if(!z.$isWO)a=!!z.$iscX?z.br(a):[]
+if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
 z=this.vy
 if(a===z)return
 this.Ke()
-this.S6=a
-if(!!J.x(a).$iswn&&this.ts===!0&&this.ur!==!0){if(a.gID()!=null)a.sID([])
-this.VC=a.gRT().yI(this.gk8())}y=this.S6
+this.lS=a
+if(!!J.x(a).$iswn&&this.Ee===!0&&this.ur!==!0){if(a.gb3()!=null)a.sb3([])
+this.VC=a.gRT().yI(this.gk8())}y=this.lS
 y=y!=null?y:[]
 this.cJ(G.jj(y,0,J.q8(y),z,0,z.length))},
-F1:function(a){var z,y,x,w
+Ih:function(a){var z,y,x,w
 z=J.x(a)
 if(z.n(a,-1))return this.YS.rF
 y=this.SU
 z=z.U(a,2)
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 x=y[z]
-if(M.wR(x)){z=this.YS.rF
+if(M.RI(x)){z=this.YS.rF
 z=x==null?z==null:x===z}else z=!0
 if(z)return x
 w=M.Ky(x).gos()
 if(w==null)return x
-return w.F1(C.jn.cU(w.SU.length,2)-1)},
+return w.Ih(C.jn.cU(w.SU.length,2)-1)},
 uy:function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
-y=this.F1(z.W(a,1))
+y=this.Ih(z.W(a,1))
 x=b!=null
 if(x)w=b.lastChild
 else w=c!=null&&J.yx(c)?J.MQ(c):null
@@ -15904,15 +16603,15 @@
 z=z.U(a,2)
 H.IC(this.SU,z,[w,d])
 v=J.Tm(this.YS.rF)
-u=J.tx(y)
+u=J.p7(y)
 if(x)v.insertBefore(b,u)
 else if(c!=null)for(z=J.mY(c);z.G();)v.insertBefore(z.gl(),u)},
 ne:function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
 y=J.Wx(a)
-x=this.F1(y.W(a,1))
-w=this.F1(a)
+x=this.Ih(y.W(a,1))
+w=this.Ih(a)
 v=this.SU
 u=J.ew(y.U(a,2),1)
 if(u>>>0!==u||u>=v.length)return H.e(v,u)
@@ -15925,12 +16624,12 @@
 if(v!=null)v.removeChild(s)
 z.push(s)}return new M.wS(z,t)},
 cJ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f
-if(this.Jh||J.FN(a)===!0)return
+if(this.Jh||J.tx(a)===!0)return
 t=this.YS
 s=t.rF
-if(J.Tm(s)==null){this.xO(0)
+if(J.Tm(s)==null){this.S6(0)
 return}r=this.vy
-Q.Y5(r,this.S6,a)
+Q.Y5(r,this.lS,a)
 z=t.nF
 if(!this.Wv){this.Wv=!0
 q=(!!J.x(t.rF).$isDT?t.rF:t).gzH()
@@ -15946,35 +16645,35 @@
 x=null
 h=p.Rz(0,y)
 w=null
-if(h!=null&&J.yx(J.Bq(h))){w=h.gWf()
+if(h!=null&&J.yx(J.Bq(h))){w=h.gpp()
 g=J.Bq(h)}else{try{w=[]
 if(this.eY!=null)y=this.RV(y)
-if(y!=null)x=t.a5(y,z,w)}catch(f){k=H.Ru(f)
+if(y!=null)x=t.dI(y,z,w)}catch(f){k=H.Ru(f)
 v=k
-u=new H.oP(f,null)
+u=new H.XO(f,null)
 k=new P.vs(0,$.X3,null,null,null,null,null,null)
 k.$builtinTypeInfo=[null]
 new P.Zf(k).$builtinTypeInfo=[null]
 j=v
 if(j==null)H.vh(P.u("Error must not be null"))
 if(k.Gv!==0)H.vh(P.w("Future already completed"))
-k.CG(j,u)}g=null}this.uy(i,x,g,w)}}for(t=p.gUQ(p),t=H.VM(new H.MH(null,J.mY(t.l6),t.T6),[H.Kp(t,0),H.Kp(t,1)]);t.G();)this.Ep(t.lo.gWf())},"$1","gk8",2,0,161,162],
+k.CG(j,u)}g=null}this.uy(i,x,g,w)}}for(t=p.gUQ(p),t=H.VM(new H.MH(null,J.mY(t.l6),t.T6),[H.Kp(t,0),H.Kp(t,1)]);t.G();)this.Ep(t.lo.gpp())},"$1","gk8",2,0,178,179],
 Ep:function(a){var z
-for(z=J.mY(a);z.G();)J.yd(z.gl())},
+for(z=J.mY(a);z.G();)J.x0(z.gl())},
 Ke:function(){var z=this.VC
 if(z==null)return
 z.ed()
 this.VC=null},
-xO:function(a){var z,y
+S6:function(a){var z,y
 if(this.Jh)return
 this.Ke()
 for(z=this.SU,y=1;y<z.length;y+=2)this.Ep(z[y])
 C.Nm.sB(z,0)
-this.x5()
+this.NC()
 this.YS.os=null
 this.Jh=!0}},
 wS:{
-"^":"a;UN>,Wf<",
+"^":"a;UN>,pp<",
 $iswS:true},
 XT:{
 "^":"vy;rF,u2,Vw",
@@ -15982,20 +16681,20 @@
 if(!J.xC(b,"text"))return M.vy.prototype.nR.call(this,this,b,c,d)
 if(d){z=c==null?"":H.d(c)
 J.t3(this.rF,z)
-return}this.Yj(0,b)
-z=this.gMm()
+return}this.Mh(0,b)
+z=this.gmt()
 z.$1(J.mu(c,z))
 this.gCd(this).u(0,b,c)
 return c},
 ux:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gMm",2,0,10,18]},
-wl:{
+J.t3(this.rF,z)},"$1","gmt",2,0,10,18]},
+VT:{
 "^":"V2;rF,u2,Vw",
 grF:function(){return this.rF},
 nR:function(a,b,c,d){var z,y,x,w
 if(!J.xC(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
 if(d){M.pw(this.rF,c,b)
-return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
+return}J.n1(!!J.x(this.grF()).$isvy?this.grF():this,b)
 J.Vs(this.rF).Rz(0,b)
 z=this.gCd(this)
 y=this.rF
@@ -16045,7 +16744,7 @@
 x=z.length
 w=C.jn.cU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","gzf",2,0,163,18],
+return y+H.d(z[w])},"$1","gzf",2,0,180,18],
 cH:[function(a){var z,y,x,w,v,u,t,s
 z=this.jU
 if(0>=z.length)return H.e(z,0)
@@ -16056,9 +16755,9 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gB5",2,0,164,165],
+y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gB5",2,0,181,182],
 l3:function(a,b){this.V6=this.jU.length===5?this.gzf():this.gB5()},
-static:{"^":"rz5,jO,t3a,epG,UO,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+static:{"^":"rz5,jO,t3a,epG,oM,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
 z=a.length
 for(y=b==null,x=J.U6(a),w=null,v=0,u=!0;v<z;){t=x.XU(a,"{{",v)
@@ -16087,8 +16786,8 @@
 "^":"",
 I5:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-static:{vC:function(a){var z,y,x,w
-z=$.J1()
+static:{cF:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -16102,14 +16801,14 @@
 return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
 el:{
-"^":"V38;uB,lc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V47;uB,lc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-RF:[function(a,b){J.LE(a.uB).wM(b)},"$1","gVm",2,0,17,66],
+RF:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,17,82],
 static:{oH:function(a){var z,y,x,w
-z=$.J1()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -16117,10 +16816,10 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.nt.ZL(a)
-C.nt.XI(a)
+C.bV.ZL(a)
+C.bV.XI(a)
 return a}}},
-V38:{
+V47:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
@@ -16137,7 +16836,7 @@
 W.KV.$isa=true
 W.my.$isa=true
 W.yg.$isa=true
-W.M5.$isa=true
+W.QI.$isa=true
 P.qU.$isqU=true
 P.qU.$isRz=true
 P.qU.$asRz=[P.qU]
@@ -16154,7 +16853,7 @@
 P.a6.$isa=true
 P.qv.$isa=true
 P.WO.$isWO=true
-P.WO.$iscX=true
+P.WO.$isQV=true
 P.WO.$isa=true
 W.h4.$ish4=true
 W.h4.$isKV=true
@@ -16165,15 +16864,15 @@
 K.O1.$isa=true
 U.WH.$ishw=true
 U.WH.$isa=true
-U.Jy.$ishw=true
-U.Jy.$isa=true
+U.Nb.$ishw=true
+U.Nb.$isa=true
 U.zX.$iszX=true
 U.zX.$ishw=true
 U.zX.$isa=true
-U.Cu.$ishw=true
-U.Cu.$isa=true
-U.x0.$ishw=true
-U.x0.$isa=true
+U.ma.$ishw=true
+U.ma.$isa=true
+U.HB.$ishw=true
+U.HB.$isa=true
 U.Mp.$ishw=true
 U.Mp.$isa=true
 U.x9.$ishw=true
@@ -16189,14 +16888,14 @@
 U.c0.$isa=true
 U.ae.$ishw=true
 U.ae.$isa=true
-U.Mm.$ishw=true
-U.Mm.$isa=true
-T.yj.$isyj=true
-T.yj.$isa=true
+U.Qb.$ishw=true
+U.Qb.$isa=true
 P.IN.$isIN=true
 P.IN.$isa=true
 P.uq.$isa=true
 N.Rw.$isa=true
+T.yj.$isyj=true
+T.yj.$isa=true
 G.DA.$isDA=true
 G.DA.$isa=true
 G.Y2.$isY2=true
@@ -16204,16 +16903,14 @@
 W.tV.$ish4=true
 W.tV.$isKV=true
 W.tV.$isa=true
-N.HV.$isHV=true
-N.HV.$isa=true
-P.a2.$isa2=true
-P.a2.$isa=true
+F.d3.$isa=true
 A.XP.$isa=true
 A.Ap.$isa=true
 L.Tv.$isTv=true
 L.Tv.$isa=true
+P.a2.$isa2=true
+P.a2.$isa=true
 M.wS.$isa=true
-F.d3.$isa=true
 W.ea.$isea=true
 W.ea.$isa=true
 P.cb.$iscb=true
@@ -16254,11 +16951,13 @@
 D.kx.$iskx=true
 D.kx.$isaf=true
 D.kx.$isa=true
-D.D5.$isa=true
+D.t9.$isa=true
 D.HJ.$isa=true
 W.AW.$isea=true
 W.AW.$isa=true
-H.zL.$isa=true
+N.HV.$isHV=true
+N.HV.$isa=true
+H.yo.$isa=true
 H.IY.$isa=true
 H.aX.$isa=true
 W.I0.$isKV=true
@@ -16267,30 +16966,40 @@
 U.hw.$ishw=true
 U.hw.$isa=true
 G.Ni.$isa=true
-P.MN.$isMN=true
-P.MN.$isa=true
+P.qK.$isqK=true
+P.qK.$isa=true
+P.xp.$isxp=true
+P.xp.$isa=true
+P.mE.$ismE=true
+P.mE.$isa=true
 P.KA.$isKA=true
-P.KA.$isoK=true
+P.KA.$isNOT=true
 P.KA.$isMO=true
 P.KA.$isa=true
-P.f6.$isf6=true
-P.f6.$isKA=true
-P.f6.$isoK=true
-P.f6.$isMO=true
-P.f6.$isa=true
+P.LR.$isLR=true
+P.LR.$isKA=true
+P.LR.$isNOT=true
+P.LR.$isMO=true
+P.LR.$isa=true
 V.qC.$isqC=true
 V.qC.$isZ0=true
 V.qC.$isa=true
 P.Rz.$isRz=true
 P.Rz.$isa=true
-P.cX.$iscX=true
-P.cX.$isa=true
+P.aY.$isaY=true
+P.aY.$isa=true
+P.Z0.$isZ0=true
+P.Z0.$isa=true
+P.Xa.$isXa=true
+P.Xa.$isa=true
+P.QV.$isQV=true
+P.QV.$isa=true
 P.b8.$isb8=true
 P.b8.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
-P.oK.$isoK=true
-P.oK.$isa=true
+P.NOT.$isNOT=true
+P.NOT.$isa=true
 P.fIm.$isfIm=true
 P.fIm.$isa=true
 P.iP.$isiP=true
@@ -16301,8 +17010,6 @@
 O.Hz.$isa=true
 L.AR.$isAR=true
 L.AR.$isa=true
-P.Z0.$isZ0=true
-P.Z0.$isa=true
 D.N7.$isN7=true
 D.N7.$isaf=true
 D.N7.$isa=true
@@ -16317,13 +17024,13 @@
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.M3(a)}
+return J.m0(a)}
 J.U6=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.M3(a)}
+return J.m0(a)}
 J.Wx=function(a){if(typeof a=="number")return J.P.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
@@ -16336,20 +17043,21 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.M3(a)}
+return J.m0(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.L7.prototype
 return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
-if(a==null)return J.we.prototype
+if(a==null)return J.ht.prototype
 if(typeof a=="boolean")return J.yEe.prototype
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.M3(a)}
+return J.m0(a)}
 J.A4=function(a,b){return J.RE(a).sjx(a,b)}
 J.AF=function(a){return J.RE(a).gIi(a)}
 J.AG=function(a){return J.x(a).bu(a)}
 J.AI=function(a,b){return J.RE(a).su6(a,b)}
-J.AK=function(a){return J.RE(a).Zi(a)}
+J.AJ=function(a,b){return J.RE(a).sWp(a,b)}
+J.AK=function(a){return J.RE(a).gWp(a)}
 J.AL=function(a){return J.RE(a).gW6(a)}
 J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
 J.Ak=function(a){return J.RE(a).ghy(a)}
@@ -16362,9 +17070,11 @@
 return J.Wx(a).E(a,b)}
 J.Bq=function(a){return J.RE(a).gUN(a)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
+J.C3=function(a,b){return J.RE(a).sig(a,b)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-J.CN=function(a){return J.RE(a).gd0(a)}
-J.D9=function(a){return J.RE(a).GB(a)}
+J.Cm=function(a){return J.RE(a).gvC(a)}
+J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
+J.DB=function(a){return J.RE(a).BM(a)}
 J.DF=function(a,b){return J.RE(a).soc(a,b)}
 J.DL=function(a){return J.RE(a).gK4(a)}
 J.DO=function(a){return J.RE(a).gR(a)}
@@ -16374,40 +17084,35 @@
 J.Do=function(a){return J.RE(a).gM0(a)}
 J.Dq=function(a,b){return J.w1(a).Rz(a,b)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
-J.Dz=function(a,b){return J.RE(a).sDX(a,b)}
+J.Du=function(a){return J.RE(a).gxN(a)}
 J.E3=function(a){return J.RE(a).gRu(a)}
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
-J.EO=function(a){return J.RE(a).gks(a)}
-J.Eh=function(a,b){return J.Wx(a).O(a,b)}
-J.El=function(a,b){return J.RE(a).sU4(a,b)}
+J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
 J.Er=function(a,b){return J.RE(a).sfY(a,b)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
-J.Ex=function(a,b){return J.RE(a).sjl(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
-J.FI=function(a){return J.RE(a).gig(a)}
-J.FN=function(a){return J.U6(a).gl0(a)}
+J.FI=function(a,b,c,d){return J.RE(a).YJ(a,b,c,d)}
 J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
 J.FW=function(a,b){return J.rY(a).j(a,b)}
 J.Fc=function(a,b){return J.RE(a).sP(a,b)}
-J.Ff=function(a){return J.RE(a).gXN(a)}
-J.Fg=function(a,b){return J.RE(a).sKE(a,b)}
+J.GF=function(a,b){return J.RE(a).spM(a,b)}
 J.GT=function(a,b){return J.RE(a).sQl(a,b)}
 J.GW=function(a){return J.RE(a).gVY(a)}
 J.Gc=function(a){return J.RE(a).gnv(a)}
 J.H3=function(a,b){return J.RE(a).sZA(a,b)}
 J.HF=function(a){return J.RE(a).gD7(a)}
+J.HO=function(a){return J.RE(a).gWw(a)}
+J.Hf=function(a){return J.RE(a).gd0(a)}
 J.Hn=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
 J.Hr=function(a){return J.RE(a).gL0(a)}
 J.I1=function(a){return J.RE(a).gSf(a)}
 J.I2=function(a){return J.RE(a).gwv(a)}
 J.II=function(a){return J.w1(a).Jd(a)}
-J.IJ=function(a){return J.RE(a).gHt(a)}
 J.IO=function(a){return J.RE(a).gRH(a)}
 J.IX=function(a,b){return J.RE(a).sEu(a,b)}
 J.Ip=function(a,b){return J.RE(a).QS(a,b)}
-J.Is=function(a,b){return J.rY(a).Tc(a,b)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
@@ -16427,35 +17132,36 @@
 J.Kl=function(a){return J.RE(a).gBP(a)}
 J.Kn=function(a){return J.Wx(a).yu(a)}
 J.Kt=function(a){return J.RE(a).gG3(a)}
+J.Kz=function(a,b){return J.RE(a).sni(a,b)}
 J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
 return J.Wx(a).V(a,b)}
 J.LB=function(a){return J.RE(a).gX0(a)}
 J.LE=function(a){return J.RE(a).VD(a)}
-J.LI=function(a,b){return J.RE(a).sGq(a,b)}
 J.LL=function(a){return J.Wx(a).HG(a)}
 J.LM=function(a,b){return J.RE(a).szj(a,b)}
+J.LP=function(a,b){return J.RE(a).sJ6(a,b)}
 J.LY=function(a){return J.RE(a).gPZ(a)}
 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.Ln=function(a){return J.RE(a).gdU(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
+J.Lr=function(a){return J.RE(a).gMj(a)}
 J.M4=function(a){return J.RE(a).gJN(a)}
 J.ME=function(a,b){return J.RE(a).sUo(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.Mb=function(a){return J.RE(a).gSY(a)}
+J.MX=function(a,b){return J.RE(a).sPj(a,b)}
 J.Mi=function(a,b){return J.RE(a).sWA(a,b)}
 J.Mo=function(a){return J.RE(a).gx6(a)}
-J.Mu=function(a,b){return J.RE(a).sig(a,b)}
-J.Mx=function(a,b,c){return J.w1(a).aP(a,b,c)}
+J.Mx=function(a){return J.RE(a).gks(a)}
 J.Mz=function(a){return J.RE(a).goE(a)}
 J.N1=function(a){return J.RE(a).Es(a)}
-J.ND=function(a,b){return J.RE(a).sDQ(a,b)}
 J.NO=function(a,b){return J.RE(a).soE(a,b)}
 J.NQ=function(a){return J.RE(a).gjb(a)}
 J.NT=function(a,b,c){return J.U6(a).eM(a,b,c)}
 J.Nd=function(a){return J.w1(a).br(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
+J.Nh=function(a,b){return J.RE(a).sSY(a,b)}
 J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
 J.Nl=function(a){return J.RE(a).gO3(a)}
 J.O2=function(a){return J.RE(a).JP(a)}
@@ -16463,9 +17169,10 @@
 J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.OL=function(a){return J.RE(a).gQl(a)}
-J.OP=function(a){return J.RE(a).gVm(a)}
-J.OS=function(a,b){return J.w1(a).tt(a,b)}
+J.OT=function(a){return J.RE(a).gXE(a)}
 J.Ok=function(a){return J.RE(a).ghU(a)}
+J.Oo=function(a,b){return J.RE(a).sjT(a,b)}
+J.P2=function(a,b){return J.RE(a).sU4(a,b)}
 J.P5=function(a){return J.RE(a).gHo(a)}
 J.PB=function(a){return J.RE(a).gI(a)}
 J.PN=function(a,b){return J.RE(a).sCI(a,b)}
@@ -16478,41 +17185,44 @@
 J.Q4=function(a){return J.RE(a).gph(a)}
 J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
-J.QD=function(a){return J.RE(a).gdB(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
 J.QT=function(a,b){return J.RE(a).vV(a,b)}
 J.QX=function(a){return J.RE(a).gUo(a)}
+J.QZ=function(a){return J.RE(a).gpM(a)}
+J.Qa=function(a){return J.RE(a).gNN(a)}
 J.Qd=function(a){return J.RE(a).gRn(a)}
-J.Qk=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
 J.Qv=function(a,b){return J.RE(a).sX0(a,b)}
 J.Qy=function(a,b){return J.RE(a).shf(a,b)}
+J.R1=function(a){return J.RE(a).Fn(a)}
 J.RC=function(a){return J.RE(a).gTA(a)}
 J.RF=function(a,b){return J.RE(a).WO(a,b)}
+J.RX=function(a,b){return J.RE(a).sjl(a,b)}
+J.RY=function(a,b){return J.rY(a).Tc(a,b)}
 J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
 J.Ry=function(a){return J.RE(a).gLW(a)}
 J.S2=function(a,b){return J.RE(a).jn(a,b)}
 J.S5=function(a,b){return J.RE(a).sbA(a,b)}
 J.S9=function(a){return J.RE(a).gyX(a)}
-J.SB=function(a,b){return J.RE(a).Yj(a,b)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
 J.SK=function(a){return J.RE(a).xW(a)}
 J.SM=function(a){return J.RE(a).gbw(a)}
 J.SS=function(a,b){return J.RE(a).sIt(a,b)}
 J.SZ=function(a){return J.RE(a).gSO(a)}
+J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
+J.Sj=function(a,b){return J.RE(a).svC(a,b)}
 J.Sl=function(a){return J.RE(a).gxb(a)}
 J.Sz=function(a){return J.RE(a).gUx(a)}
-J.T1=function(a,b){return J.x(a).T(a,b)}
-J.T3=function(a,b){return J.RE(a).sni(a,b)}
-J.TR=function(a,b){return J.RE(a).saL(a,b)}
 J.Td=function(a){return J.RE(a).gpf(a)}
 J.Tm=function(a){return J.RE(a).gBy(a)}
-J.To=function(a){return J.RE(a).gni(a)}
+J.Tr=function(a){return J.RE(a).gCj(a)}
 J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
 J.U2=function(a){return J.w1(a).V1(a)}
+J.U8=function(a){return J.RE(a).gEQ(a)}
 J.U8o=function(a){return J.RE(a).gUQ(a)}
+J.UC=function(a){return J.RE(a).dQ(a)}
 J.UM=function(a){return J.RE(a).gu7(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
@@ -16525,21 +17235,24 @@
 J.VL=function(a){return J.RE(a).gR2(a)}
 J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.Vi=function(a){return J.RE(a).grO(a)}
-J.Vk=function(a,b){return J.w1(a).ev(a,b)}
+J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Vl=function(a){return J.RE(a).gja(a)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vr=function(a,b){return J.RE(a).Kb(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
 J.Vw=function(a,b){return J.U6(a).sB(a,b)}
 J.W2=function(a){return J.RE(a).gCf(a)}
+J.WA=function(a){return J.RE(a).gMZ(a)}
 J.WB=function(a,b){return J.RE(a).skZ(a,b)}
 J.WI=function(a,b){return J.RE(a).sLF(a,b)}
+J.WM=function(a){return J.RE(a).gyv(a)}
 J.WT=function(a){return J.RE(a).gFR(a)}
 J.WX=function(a){return J.RE(a).gbJ(a)}
 J.WY=function(a){return J.RE(a).gnp(a)}
 J.Wp=function(a){return J.RE(a).gQU(a)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
+J.YQ=function(a){return J.RE(a).gPL(a)}
 J.Yf=function(a){return J.w1(a).gIr(a)}
 J.Yq=function(a){return J.RE(a).gSR(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
@@ -16552,17 +17265,17 @@
 J.a8=function(a,b){return J.RE(a).sdU(a,b)}
 J.aA=function(a){return J.RE(a).gzY(a)}
 J.aT=function(a){return J.RE(a).god(a)}
+J.aw=function(a,b){return J.RE(a).sNN(a,b)}
 J.bB=function(a){return J.x(a).gbx(a)}
 J.ba=function(a){return J.RE(a).gKJ(a)}
 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.br=function(a,b){return J.w1(a).XP(a,b)}
 J.bu=function(a){return J.RE(a).gyw(a)}
-J.c1=function(a,b){return J.RE(a).Wk(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cO=function(a){return J.RE(a).gjx(a)}
+J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
 J.cU=function(a){return J.RE(a).gHh(a)}
-J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cd=function(a){return J.RE(a).gql(a)}
 J.cl=function(a,b){return J.RE(a).sHt(a,b)}
 J.co=function(a,b){return J.rY(a).nC(a,b)}
@@ -16570,45 +17283,48 @@
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
+J.dq=function(a){return J.RE(a).gJD(a)}
 J.eU=function(a){return J.RE(a).gY9(a)}
-J.eg=function(a){return J.RE(a).Ms(a)}
 J.ew=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
 J.fA=function(a){return J.RE(a).gJp(a)}
 J.fD=function(a){return J.RE(a).e6(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
-J.fa=function(a){return J.RE(a).gMj(a)}
+J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
+J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.fc=function(a,b){return J.RE(a).sR(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
 J.fv=function(a,b){return J.RE(a).sUx(a,b)}
 J.fw=function(a){return J.RE(a).gEl(a)}
-J.hQ=function(a,b){return J.RE(a).sjT(a,b)}
+J.fy=function(a){return J.RE(a).gIF(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
 J.hb=function(a){return J.RE(a).gQ1(a)}
 J.hn=function(a){return J.RE(a).gEu(a)}
 J.i9=function(a,b){return J.w1(a).Zv(a,b)}
+J.iH=function(a,b){return J.RE(a).sDQ(a,b)}
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iM=function(a,b){return J.RE(a).st5(a,b)}
 J.iS=function(a){return J.RE(a).gox(a)}
 J.iY=function(a){return J.RE(a).gnN(a)}
+J.ih=function(a){return J.RE(a).ga5(a)}
 J.io=function(a){return J.RE(a).gBV(a)}
 J.is=function(a){return J.RE(a).gZm(a)}
 J.iz=function(a,b){return J.RE(a).GE(a,b)}
 J.j1=function(a){return J.RE(a).gZA(a)}
 J.jH=function(a){return J.RE(a).ghN(a)}
-J.jM=function(a,b){return J.RE(a).sPj(a,b)}
 J.jP=function(a){return J.RE(a).gbA(a)}
 J.jd=function(a,b){return J.RE(a).snZ(a,b)}
+J.jf=function(a,b){return J.x(a).T(a,b)}
+J.jl=function(a){return J.RE(a).gHt(a)}
 J.jo=function(a){return J.RE(a).gCI(a)}
-J.jz=function(a){if(typeof a=="number")return-a
+J.jzo=function(a){if(typeof a=="number")return-a
 return J.Wx(a).J(a)}
 J.k7=function(a,b){return J.RE(a).sGd(a,b)}
 J.kB=function(a,b){return J.RE(a).sFR(a,b)}
 J.kE=function(a){return J.w1(a).git(a)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
-J.kS=function(a){return J.RE(a).gVU(a)}
 J.kW=function(a,b,c){if((a.constructor==Array||H.Gp(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.kX=function(a,b){return J.RE(a).sNb(a,b)}
@@ -16619,29 +17335,37 @@
 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.l7=function(a,b){return J.RE(a).sv8(a,b)}
-J.lN=function(a){return J.RE(a).gil(a)}
+J.lB=function(a){return J.RE(a).guT(a)}
 J.lT=function(a){return J.RE(a).gOd(a)}
+J.lf=function(a,b){return J.Wx(a).O(a,b)}
 J.ls=function(a){return J.RE(a).gt3(a)}
+J.m4=function(a){return J.RE(a).gig(a)}
 J.m9=function(a,b){return J.RE(a).wR(a,b)}
+J.mB=function(a){return J.RE(a).Zi(a)}
 J.mP=function(a){return J.RE(a).gzj(a)}
 J.mU=function(a,b){return J.RE(a).skm(a,b)}
 J.mY=function(a){return J.w1(a).gA(a)}
 J.mu=function(a,b){return J.RE(a).TR(a,b)}
+J.n1=function(a,b){return J.RE(a).Mh(a,b)}
 J.n9=function(a){return J.RE(a).gQq(a)}
+J.nA=function(a,b){return J.RE(a).sPL(a,b)}
 J.nG=function(a){return J.RE(a).gv8(a)}
+J.np=function(a,b){return J.w1(a).tt(a,b)}
 J.ns=function(a){return J.RE(a).gjT(a)}
+J.nt=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.o0=function(a,b){return J.RE(a).sRu(a,b)}
-J.o2=function(a,b){return J.RE(a).sSY(a,b)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
 J.oL=function(a){return J.RE(a).gWT(a)}
+J.oN=function(a){return J.RE(a).gj4(a)}
 J.oO=function(a,b){return J.RE(a).siJ(a,b)}
 J.okV=function(a,b){return J.RE(a).RR(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
+J.p7=function(a){return J.RE(a).guD(a)}
 J.pB=function(a){return J.RE(a).gDX(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
 J.pW=function(a,b,c,d){return J.RE(a).Si(a,b,c,d)}
-J.pb=function(a,b){return J.w1(a).Vr(a,b)}
+J.pd=function(a){return J.RE(a).gni(a)}
 J.pm=function(a){return J.RE(a).gt0(a)}
 J.q0=function(a,b){return J.RE(a).syG(a,b)}
 J.q6=function(a,b,c){return J.U6(a).XU(a,b,c)}
@@ -16651,17 +17375,21 @@
 J.qq=function(a,b){return J.RE(a).sNG(a,b)}
 J.r0=function(a,b){return J.Wx(a).Sy(a,b)}
 J.r4=function(a){return J.RE(a).pj(a)}
-J.rl=function(a){return J.RE(a).gEV(a)}
+J.ra=function(a){return J.RE(a).gJ6(a)}
 J.rr=function(a){return J.rY(a).bS(a)}
 J.rw=function(a){return J.RE(a).gMl(a)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
 J.tF=function(a){return J.RE(a).gyW(a)}
+J.tH=function(a,b){return J.RE(a).sHy(a,b)}
 J.tQ=function(a,b){return J.RE(a).swv(a,b)}
-J.tx=function(a){return J.RE(a).guD(a)}
-J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
+J.tp=function(a){return J.RE(a).gHy(a)}
+J.tv=function(a,b){return J.RE(a).sDX(a,b)}
+J.tx=function(a){return J.U6(a).gl0(a)}
+J.u1=function(a){return J.RE(a).gSY(a)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
+J.u9=function(a){return J.RE(a).gVU(a)}
 J.uH=function(a,b){return J.rY(a).Fr(a,b)}
 J.uM=function(a,b){return J.RE(a).sod(a,b)}
 J.uP=function(a){return J.RE(a).gVE(a)}
@@ -16678,7 +17406,7 @@
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
 J.vi=function(a){return J.RE(a).gNa(a)}
-J.vr=function(a){return J.RE(a).dQ(a)}
+J.vo=function(a,b){return J.w1(a).ev(a,b)}
 J.w7=function(a,b){return J.RE(a).syW(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
@@ -16686,8 +17414,10 @@
 J.wO=function(a){return J.RE(a).gE7(a)}
 J.wd=function(a){return J.RE(a).gqw(a)}
 J.wg=function(a,b){return J.RE(a).snN(a,b)}
+J.wl=function(a,b){return J.RE(a).Ch(a,b)}
 J.wp=function(a){return J.w1(a).zB(a)}
 J.wz=function(a){return J.RE(a).gzx(a)}
+J.x0=function(a){return J.RE(a).S6(a)}
 J.x5=function(a,b){return J.U6(a).tg(a,b)}
 J.xC=function(a,b){if(a==null)return b==null
 if(typeof a!="object")return b!=null&&a===b
@@ -16696,16 +17426,13 @@
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xW=function(a,b){return J.RE(a).sZm(a,b)}
 J.xa=function(a){return J.RE(a).geS(a)}
+J.xq=function(a,b){return J.w1(a).Vr(a,b)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
+J.y9=function(a){return J.RE(a).lh(a)}
 J.yA=function(a){return J.RE(a).gvu(a)}
-J.yK=function(a){return J.RE(a).gWw(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yZ=function(a){return J.RE(a).gGq(a)}
-J.yd=function(a){return J.RE(a).xO(a)}
 J.yi=function(a){return J.RE(a).gbN(a)}
-J.yk=function(a,b){return J.RE(a).sVm(a,b)}
 J.yn=function(a){return J.RE(a).gkZ(a)}
-J.yo=function(a){return J.RE(a).gPW(a)}
 J.yq=function(a){return J.RE(a).gNs(a)}
 J.yx=function(a){return J.U6(a).gor(a)}
 J.yz=function(a){return J.RE(a).gLF(a)}
@@ -16713,50 +17440,63 @@
 J.z3=function(a){return J.RE(a).gu6(a)}
 J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
-J.zD=function(a){return J.RE(a).gKE(a)}
 J.zH=function(a){return J.RE(a).gIs(a)}
 J.zN=function(a){return J.RE(a).gM6(a)}
 J.zY=function(a){return J.RE(a).gdu(a)}
 J.zj=function(a){return J.RE(a).gvH(a)}
-J.zv=function(a){return J.RE(a).gaL(a)}
 C.Gx=X.hV.prototype
 C.J0=B.G6.prototype
-C.z5=A.wM.prototype
+C.HR=A.wM.prototype
 C.YZz=Q.eW.prototype
 C.ka=Z.aC.prototype
 C.tA=O.VY.prototype
 C.ux=F.Be.prototype
 C.T0=R.i6.prototype
 C.O0=R.JI.prototype
-C.wI=F.ZP.prototype
+C.OD=F.ZP.prototype
 C.Gh=L.nJ.prototype
 C.UF=R.Eg.prototype
 C.MC=D.i7.prototype
 C.by=A.Gk.prototype
+C.Cl=X.MJ.prototype
+C.uG=X.Nr.prototype
 C.Xo=U.DK.prototype
-C.p0=N.BS.prototype
-C.pJ=O.Vb.prototype
+C.cI=N.BS.prototype
+C.Cs=O.Vb.prototype
 C.Vc=K.Ly.prototype
 C.W3=W.fJ.prototype
 C.Ie=E.mO.prototype
 C.Ig=E.DE.prototype
 C.NK=E.U1.prototype
+C.lX=E.ou.prototype
+C.Wa=E.av.prototype
+C.bZ=E.uz.prototype
+C.iR=E.Ma.prototype
+C.RVQ=E.wN.prototype
+C.wP=E.ds.prototype
+C.Ag=E.Mb.prototype
+C.Tl=E.oF.prototype
+C.wK=E.qh.prototype
+C.to=E.Q6.prototype
 C.za=E.L4.prototype
+C.ij=E.Zn.prototype
+C.Rr=E.uE.prototype
+C.aV=E.n5.prototype
 C.EL=B.pR.prototype
 C.ry=Z.hx.prototype
-C.wQ=D.Mc.prototype
-C.rC=D.Qh.prototype
-C.cF=A.fl.prototype
-C.bb=X.kK.prototype
+C.wQ=D.YA.prototype
+C.kd=D.Qh.prototype
+C.uF=A.fl.prototype
+C.kS=X.kK.prototype
 C.LN=N.oa.prototype
 C.F2=D.IW.prototype
 C.Ji=D.Oz.prototype
-C.nM=D.St.prototype
+C.Hj=D.St.prototype
 C.Xe=L.qk.prototype
 C.Nm=J.Q.prototype
-C.ON=J.Pp.prototype
+C.YI=J.Pp.prototype
 C.jn=J.L7.prototype
-C.jN=J.we.prototype
+C.jN=J.ht.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
@@ -16770,33 +17510,34 @@
 C.J7=A.Ww.prototype
 C.t5=W.BH.prototype
 C.k0=V.F1.prototype
-C.Pf=Z.uL.prototype
+C.mk=Z.uL.prototype
 C.Sx=J.iC.prototype
 C.Ki=A.ir.prototype
-C.Cc=Q.qZ.prototype
-C.oA=T.Uy.prototype
+C.Vp=Q.qZ.prototype
+C.oA=T.ov.prototype
 C.Mh=A.kn.prototype
 C.FH=U.fI.prototype
 C.SX=R.zM.prototype
-C.Vd=D.Rk.prototype
-C.th=U.Ti.prototype
-C.HR=Q.xI.prototype
+C.ZJ=D.Rk.prototype
+C.Ns=U.Ti.prototype
+C.wU=Q.xI.prototype
 C.Yo=Q.CY.prototype
 C.dX=K.nm.prototype
 C.wB=X.uw.prototype
 C.lx=A.G1.prototype
 C.vB=J.kdQ.prototype
 C.u2=X.I5.prototype
-C.nt=U.el.prototype
+C.bV=U.el.prototype
 C.KZ=new H.hJ()
 C.x4=new U.WH()
 C.Gw=new H.Xc()
-C.Eq=new P.vG()
-C.Wj=new P.JF()
+C.Eq=new P.qn()
+C.ZB=new P.JF()
 C.pr=new P.mgb()
 C.dV=new L.iNc()
 C.NU=new P.R81()
-C.WA=new D.WAE("Collected")
+C.v8=new P.AH()
+C.wV=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
@@ -16807,15 +17548,15 @@
 C.YT=new H.GD("expr")
 C.HH=H.IL('dynamic')
 C.NS=new K.vly()
-C.px=new A.yL()
+C.px=new A.A2()
 I.ko=function(a){a.immutable$list=init
 a.fixed$length=init
 return a}
 C.XVh=I.ko([C.NS,C.px])
 C.V0=new A.ES(C.YT,C.BM,!1,C.HH,!1,C.XVh)
 C.rB=new H.GD("isolate")
-C.Ug=H.IL('bv')
-C.ZQ=new A.ES(C.rB,C.BM,!1,C.Ug,!1,C.XVh)
+C.Ks=H.IL('bv')
+C.ZQ=new A.ES(C.rB,C.BM,!1,C.Ks,!1,C.XVh)
 C.Ms=new H.GD("iconClass")
 C.Db=H.IL('qU')
 C.mI=new K.ndx()
@@ -16842,8 +17583,8 @@
 C.Wm=new H.GD("refChanged")
 C.QW=new A.ES(C.Wm,C.it,!1,C.dg,!1,C.xD)
 C.SA=new H.GD("lines")
-C.At=H.IL('WO')
-C.KI=new A.ES(C.SA,C.BM,!1,C.At,!1,C.y0)
+C.hAX=H.IL('WO')
+C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.y0)
 C.bJ=new H.GD("counters")
 C.jJ=H.IL('qC')
 C.iF=new A.ES(C.bJ,C.BM,!1,C.jJ,!1,C.XVh)
@@ -16860,6 +17601,8 @@
 C.Bk=new A.ES(C.bz,C.it,!1,C.dg,!1,C.xD)
 C.CG=new H.GD("posChanged")
 C.Ml=new A.ES(C.CG,C.it,!1,C.dg,!1,C.xD)
+C.Mc=new H.GD("flagList")
+C.XV=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.XVh)
 C.QH=new H.GD("fragmentation")
 C.kt=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.XVh)
 C.td=new H.GD("object")
@@ -16889,10 +17632,12 @@
 C.mr=new H.GD("expanded")
 C.DC=new A.ES(C.mr,C.BM,!1,C.BQ,!1,C.y0)
 C.j2=new H.GD("app")
-C.PS=H.IL('mL')
-C.zJ=new A.ES(C.j2,C.BM,!1,C.PS,!1,C.XVh)
+C.oP=H.IL('mL')
+C.zJ=new A.ES(C.j2,C.BM,!1,C.oP,!1,C.XVh)
 C.xP=new H.GD("ref")
 C.hI=new A.ES(C.xP,C.BM,!1,C.SmN,!1,C.XVh)
+C.jU=new H.GD("file")
+C.v0=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.XVh)
 C.qs=new H.GD("io")
 C.ly=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.XVh)
 C.qX=new H.GD("fragmentationChanged")
@@ -16910,8 +17655,8 @@
 C.YD=new H.GD("sampleRate")
 C.fP=new A.ES(C.YD,C.BM,!1,C.Db,!1,C.y0)
 C.Aa=new H.GD("results")
-C.Gsc=H.IL('wn')
-C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.y0)
+C.Gu=H.IL('wn')
+C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gu,!1,C.y0)
 C.t6=new H.GD("mapAsString")
 C.b6=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.y0)
 C.hf=new H.GD("label")
@@ -16919,16 +17664,20 @@
 C.UY=new H.GD("result")
 C.rT=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.XVh)
 C.PX=new H.GD("script")
-C.qn=H.IL('vx')
-C.Cj=new A.ES(C.PX,C.BM,!1,C.qn,!1,C.XVh)
+C.KB=H.IL('vx')
+C.Cj=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.XVh)
 C.S4=new H.GD("busy")
 C.FB=new A.ES(C.S4,C.BM,!1,C.BQ,!1,C.y0)
 C.AO=new H.GD("qualifiedName")
 C.UE=new A.ES(C.AO,C.BM,!1,C.Db,!1,C.XVh)
+C.OO=new H.GD("flag")
+C.RM=new A.ES(C.OO,C.BM,!1,C.jJ,!1,C.XVh)
 C.eh=new H.GD("lineMode")
 C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.y0)
 C.XA=new H.GD("cls")
 C.CO=new A.ES(C.XA,C.BM,!1,C.MR1,!1,C.XVh)
+C.fV=new H.GD("small")
+C.CN=new A.ES(C.fV,C.BM,!1,C.BQ,!1,C.XVh)
 C.AV=new H.GD("callback")
 C.h1=new A.ES(C.AV,C.BM,!1,C.HH,!1,C.XVh)
 C.PM=new H.GD("status")
@@ -16961,8 +17710,8 @@
 C.xS=new H.GD("tagSelectorChanged")
 C.bw=new A.ES(C.xS,C.it,!1,C.dg,!1,C.xD)
 C.kG=new H.GD("classTable")
-C.jt=H.IL('Vz')
-C.dh=new A.ES(C.kG,C.BM,!1,C.jt,!1,C.y0)
+C.HjP=H.IL('Vz')
+C.dh=new A.ES(C.kG,C.BM,!1,C.HjP,!1,C.y0)
 C.Dj=new H.GD("refreshTime")
 C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.y0)
 C.i4=new H.GD("code")
@@ -16974,11 +17723,16 @@
 C.eq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.XVh)
 C.a0=new H.GD("isDart")
 C.P9=new A.ES(C.a0,C.BM,!1,C.BQ,!1,C.y0)
+C.Ve=new H.GD("socket")
+C.Xmq=H.IL('WP')
+C.Gg=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.XVh)
 C.Gn=new H.GD("objectChanged")
 C.az=new A.ES(C.Gn,C.it,!1,C.dg,!1,C.xD)
 C.ne=new H.GD("exception")
 C.SNu=H.IL('EP')
 C.l6=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.XVh)
+C.Wj=new H.GD("process")
+C.FN=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.XVh)
 C.QK=new H.GD("qualified")
 C.VQ=new A.ES(C.QK,C.BM,!1,C.BQ,!1,C.XVh)
 C.yh=new H.GD("error")
@@ -16992,6 +17746,8 @@
 C.ec=new A.ES(C.XY,C.BM,!1,C.BQ,!1,C.XVh)
 C.Lc=new H.GD("kind")
 C.Tt=new A.ES(C.Lc,C.BM,!1,C.Db,!1,C.XVh)
+C.YE=new H.GD("webSocket")
+C.Xt=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.XVh)
 C.ng=I.ko([C.mI])
 C.Qs=new A.ES(C.i4,C.BM,!0,C.nq,!1,C.ng)
 C.lH=new H.GD("checkedText")
@@ -17006,16 +17762,16 @@
 C.PI=new H.GD("displayValue")
 C.lg=new A.ES(C.PI,C.BM,!1,C.Db,!1,C.y0)
 C.ny=new P.a6(0)
-C.U3=H.VM(new W.pq("change"),[W.ea])
-C.pi=H.VM(new W.pq("click"),[W.Oq])
-C.MD=H.VM(new W.pq("error"),[W.kQ])
-C.Bn=H.VM(new W.pq("hashchange"),[W.ea])
-C.i3=H.VM(new W.pq("input"),[W.ea])
-C.LF=H.VM(new W.pq("load"),[W.kQ])
-C.ph=H.VM(new W.pq("message"),[W.AW])
-C.uh=H.VM(new W.pq("mousedown"),[W.Oq])
-C.Kq=H.VM(new W.pq("mousemove"),[W.Oq])
-C.JS=function(hooks) {
+C.U3=H.VM(new W.FkO("change"),[W.ea])
+C.nI=H.VM(new W.FkO("click"),[W.Oq])
+C.MD=H.VM(new W.FkO("error"),[W.kQ])
+C.yZ=H.VM(new W.FkO("hashchange"),[W.ea])
+C.i3=H.VM(new W.FkO("input"),[W.ea])
+C.LF=H.VM(new W.FkO("load"),[W.kQ])
+C.ph=H.VM(new W.FkO("message"),[W.AW])
+C.uh=H.VM(new W.FkO("mousedown"),[W.Oq])
+C.Kq=H.VM(new W.FkO("mousemove"),[W.Oq])
+C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
 }
@@ -17128,7 +17884,7 @@
   hooks.getTag = getTagIE;
   hooks.prototypeForTag = prototypeForTagIE;
 }
-C.NH=function(hooks) {
+C.hQ=function(hooks) {
   var getTag = hooks.getTag;
   var prototypeForTag = hooks.prototypeForTag;
   function getTagFixed(o) {
@@ -17146,44 +17902,48 @@
   hooks.getTag = getTagFixed;
   hooks.prototypeForTag = prototypeForTagFixed;
 }
-C.zc=new P.D4(null,null)
+C.xr=new P.D4(null,null)
 C.A3=new P.Cf(null)
 C.Sr=new P.ze(null,null)
 C.Ab=new N.qV("FINER",400)
-C.eI=new N.qV("FINE",500)
+C.t4=new N.qV("FINE",500)
 C.IF=new N.qV("INFO",800)
 C.Xm=new N.qV("SEVERE",1000)
 C.nT=new N.qV("WARNING",900)
-C.Yy=new H.GD("keys")
+C.SV=new H.GD("keys")
 C.Yn=new H.GD("values")
 C.Wn=new H.GD("length")
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
-C.Zw=I.ko([C.Yy,C.Yn,C.Wn,C.ai,C.nZ])
+C.WK=I.ko([C.SV,C.Yn,C.Wn,C.ai,C.nZ])
 C.yD=I.ko([0,0,26498,1023,65534,34815,65534,18431])
 C.G8=I.ko(["==","!=","<=",">=","||","&&"])
 C.Cd=I.ko(["in","this"])
 C.QC=I.ko(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
 C.bg=I.ko([43,45,42,47,33,38,37,60,61,62,63,94,124])
-C.iq=I.ko([40,41,91,93,123,125])
+C.ML=I.ko([40,41,91,93,123,125])
 C.zao=I.ko(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.uE=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
+C.z5=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
 C.p5=I.ko(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.Mk=new H.Px(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.paX=I.ko(["name","extends","constructor","noscript","attributes"])
 C.kr=new H.Px(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.CM=new H.Px(0,{},C.xD)
-C.MB=I.ko(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.SP=new H.Px(17,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.MB)
-C.d6=I.ko(["enumerate"])
-C.eu=new H.Px(1,{enumerate:K.yU()},C.d6)
+C.V0I=I.ko(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
+C.SP=new H.Px(17,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.V0I)
+C.MEG=I.ko(["enumerate"])
+C.eu=new H.Px(1,{enumerate:K.G5()},C.MEG)
 C.tq=H.IL('Bo')
-C.pg=H.IL('wA')
-C.wE=I.ko([C.pg])
+C.uwj=H.IL('wA')
+C.wE=I.ko([C.uwj])
 C.Xk=new A.Wq(!1,!1,!0,C.tq,!1,!0,C.wE,null)
-C.wVi=H.IL('yL')
-C.bt=I.ko([C.wVi])
-C.YV=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.bt,null)
+C.BzF=H.IL('A2')
+C.RNu=I.ko([C.BzF])
+C.Hh=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.RNu,null)
+C.wj=new D.l8R("Internal")
+C.Cn=new D.l8R("Listening")
+C.qp=new D.l8R("Normal")
+C.FJ=new D.l8R("Pipe")
 C.IH=new H.GD("address")
 C.US=new H.GD("architecture")
 C.Zg=new H.GD("args")
@@ -17194,6 +17954,7 @@
 C.C0=new H.GD("change")
 C.eZ=new H.GD("changeSort")
 C.OI=new H.GD("classes")
+C.To=new H.GD("closing")
 C.qt=new H.GD("coloring")
 C.p1=new H.GD("columns")
 C.M8=new H.GD("currentHash")
@@ -17206,6 +17967,7 @@
 C.u7=new H.GD("evalNow")
 C.Ek=new H.GD("expander")
 C.Pn=new H.GD("expanderStyle")
+C.R3=new H.GD("fd")
 C.Gd=new H.GD("firstTokenPos")
 C.FP=new H.GD("formatSize")
 C.kF=new H.GD("formatTime")
@@ -17247,6 +18009,7 @@
 C.tD=new H.GD("isList")
 C.Of=new H.GD("isNull")
 C.pY=new H.GD("isOptimized")
+C.LA=new H.GD("isPipe")
 C.Lk=new H.GD("isString")
 C.dK=new H.GD("isType")
 C.xf=new H.GD("isUnexpected")
@@ -17256,7 +18019,10 @@
 C.ur=new H.GD("lib")
 C.VN=new H.GD("libraries")
 C.VI=new H.GD("line")
+C.cc=new H.GD("listening")
 C.DY=new H.GD("loading")
+C.Lx=new H.GD("localAddress")
+C.M3=new H.GD("localPort")
 C.wT=new H.GD("mainPort")
 C.pX=new H.GD("message")
 C.VD=new H.GD("mouseOut")
@@ -17272,11 +18038,15 @@
 C.zm=new H.GD("padding")
 C.Ic=new H.GD("pause")
 C.yG=new H.GD("pauseEvent")
+C.AY=new H.GD("protocol")
+C.I7=new H.GD("readClosed")
 C.GR=new H.GD("refresh")
 C.KX=new H.GD("refreshCoverage")
 C.ja=new H.GD("refreshGC")
 C.MT=new H.GD("registerCallback")
 C.Gi=new H.GD("relativeHashLink")
+C.yL=new H.GD("remoteAddress")
+C.ni=new H.GD("remotePort")
 C.X2=new H.GD("resetAccumulator")
 C.F3=new H.GD("response")
 C.nY=new H.GD("resume")
@@ -17289,8 +18059,9 @@
 C.EA=new H.GD("scripts")
 C.oW=new H.GD("selectExpr")
 C.hd=new H.GD("serviceType")
+C.jM=new H.GD("socketOwner")
 C.DW=new H.GD("sortedRows")
-C.R3=new H.GD("stacktrace")
+C.Pf=new H.GD("stacktrace")
 C.Nv=new H.GD("subclass")
 C.hO=new H.GD("tipExclusive")
 C.ei=new H.GD("tipKind")
@@ -17308,36 +18079,47 @@
 C.mh=new H.GD("uptime")
 C.Fh=new H.GD("url")
 C.jh=new H.GD("v")
-C.YI=new H.GD("value")
+C.zdr=new H.GD("value")
+C.fj=new H.GD("variable")
 C.xw=new H.GD("variables")
 C.zn=new H.GD("version")
 C.Tc=new H.GD("vmName")
+C.Uy=new H.GD("writeClosed")
 C.k5=H.IL('hx')
+C.hP=H.IL('uz')
+C.KS=H.IL('oD')
 C.Mf=H.IL('G1')
-C.cI=H.IL('Dg')
+C.q0S=H.IL('Dg')
 C.Dl=H.IL('F1')
+C.Jf=H.IL('Mb')
 C.UJ=H.IL('oa')
 C.E0=H.IL('aI')
 C.Y3=H.IL('CY')
 C.kq=H.IL('Nn')
 C.j4=H.IL('IW')
+C.Vx=H.IL('MJ')
 C.Vh=H.IL('qZ')
 C.dH=H.IL('Pz')
 C.HC=H.IL('F0')
+C.rR=H.IL('wN')
 C.yS=H.IL('G6')
+C.z7=H.IL('YA')
 C.Sb=H.IL('kn')
 C.FQ=H.IL('a')
 C.Yc=H.IL('iP')
+C.EZ=H.IL('oF')
 C.vw=H.IL('UK')
 C.Jo=H.IL('i7')
+C.BL=H.IL('Nr')
+C.ON=H.IL('ov')
 C.jR=H.IL('Be')
 C.al=H.IL('es')
 C.PT=H.IL('CX')
 C.iD=H.IL('Vb')
-C.Zt=H.IL('Uy')
 C.ce=H.IL('kK')
+C.dD=H.IL('av')
 C.FA=H.IL('Ya')
-C.nI=H.IL('Wy')
+C.T1=H.IL('Wy')
 C.hG=H.IL('ir')
 C.Th=H.IL('fI')
 C.tU=H.IL('L4')
@@ -17347,14 +18129,16 @@
 C.K4=H.IL('hV')
 C.Mt=H.IL('hu')
 C.la=H.IL('ZX')
-C.AY=H.IL('CP')
+C.CR=H.IL('CP')
 C.xE=H.IL('aC')
 C.vu=H.IL('uw')
+C.pJ=H.IL('Q6')
+C.Yy=H.IL('uE')
 C.Yxm=H.IL('Pg')
 C.il=H.IL('xI')
 C.G0=H.IL('mJ')
 C.lp=H.IL('LU')
-C.I7=H.IL('vF')
+C.oG=H.IL('ds')
 C.TU=H.IL('Oz')
 C.OG=H.IL('eW')
 C.oZ=H.IL('HS')
@@ -17367,16 +18151,20 @@
 C.l4=H.IL('uL')
 C.Wh=H.IL('U1')
 C.Zj=H.IL('md')
-C.Im=H.IL('X6')
+C.FG=H.IL('qh')
 C.YZ=H.IL('zt')
 C.NR=H.IL('nm')
+C.DD=H.IL('Zn')
 C.qF=H.IL('mO')
 C.Ey=H.IL('wM')
 C.nX=H.IL('DE')
 C.bh=H.IL('i6')
+C.jRi=H.IL('we')
+C.Xv=H.IL('n5')
 C.KO=H.IL('ZP')
-C.BV=H.IL('Mc')
 C.Wz=H.IL('pR')
+C.Ep=H.IL('ou')
+C.tc=H.IL('Ma')
 C.Io=H.IL('Qh')
 C.wk=H.IL('nJ')
 C.te=H.IL('BS')
@@ -17395,14 +18183,14 @@
 C.XW=H.IL('uEY')
 C.oT=H.IL('VY')
 C.jK=H.IL('el')
-C.xM=new P.Fd(!1)
+C.xM=new P.u5F(!1)
 $.libraries_to_load = {}
-$.z7="$cachedFunction"
+$.H9="$cachedFunction"
 $.eb="$cachedInvocation"
 $.OK=0
 $.bf=null
-$.U9=null
-$.UA=!1
+$.P4=null
+$.lcs=!1
 $.NF=null
 $.TX=null
 $.x7=null
@@ -17410,7 +18198,7 @@
 $.vv=null
 $.Bv=null
 $.BY=null
-$.oKB=null
+$.oK=null
 $.S6=null
 $.k8=null
 $.X3=C.NU
@@ -17421,15 +18209,18 @@
 $.Y4=C.IF
 $.Y1=0
 $.ax=0
-$.Oo=null
+$.iq=null
 $.AM=!1
 $.ps=0
 $.xG=null
 $.Bh=0
 $.ok=!1
+$.AC=!1
+$.M6=null
+$.UG=!0
 $.RQ="objects/"
 $.vU=null
-$.Au=[C.tq,W.Bo,{},C.k5,Z.hx,{created:Z.BN},C.Mf,A.G1,{created:A.J8},C.cI,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Al},C.j4,D.IW,{created:D.dm},C.Vh,Q.qZ,{created:Q.RH},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.D2},C.vw,A.UK,{created:A.JT},C.Jo,D.i7,{created:D.dq},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.Zt,T.Uy,{created:T.T5},C.ce,X.kK,{created:X.os},C.FA,A.Ya,{created:A.JR},C.hG,A.ir,{created:A.oaJ},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.zg},C.vu,X.uw,{created:X.bV},C.Yxm,H.Pg,{"":H.KY},C.il,Q.xI,{created:Q.lK},C.lp,R.LU,{created:R.rA},C.I7,H.vF,{"":H.m6},C.TU,D.Oz,{created:D.RP},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.Wh,E.U1,{created:E.hm},C.Zj,A.md,{created:A.aD},C.NR,K.nm,{created:K.an},C.qF,E.mO,{created:E.G7},C.Ey,A.wM,{created:A.GO},C.nX,E.DE,{created:E.oB},C.bh,R.i6,{created:R.IT},C.KO,F.ZP,{created:F.Sj},C.BV,D.Mc,{created:D.BP},C.Wz,B.pR,{created:B.lu},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJ},C.pK,D.Rk,{created:D.ma},C.lE,U.DK,{created:U.E5},C.ri,W.yy,{},C.Az,A.Gk,{created:A.Sy},C.X8,U.Ti,{created:U.lv},C.Lg,R.JI,{created:R.p7},C.Ju,K.Ly,{created:K.le},C.mq,L.qk,{created:L.KM},C.XW,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
+$.Au=[C.tq,W.Bo,{},C.k5,Z.hx,{created:Z.BN},C.hP,E.uz,{created:E.fr},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.Jf,E.Mb,{created:E.pD},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Al},C.j4,D.IW,{created:D.dm},C.Vx,X.MJ,{created:X.Bs},C.Vh,Q.qZ,{created:Q.RH},C.rR,E.wN,{created:E.wZ7},C.yS,B.G6,{created:B.KU},C.z7,D.YA,{created:D.BP},C.Sb,A.kn,{created:A.D2},C.EZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.JT},C.Jo,D.i7,{created:D.qb},C.BL,X.Nr,{created:X.na},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.os},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.JR},C.hG,A.ir,{created:A.G7},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.cF},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.zg},C.vu,X.uw,{created:X.HI},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.eg},C.Yxm,H.Pg,{"":H.KY},C.il,Q.xI,{created:Q.lK},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pI},C.TU,D.Oz,{created:D.RP},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.zf},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.Wh,E.U1,{created:E.hm},C.Zj,A.md,{created:A.DCi},C.FG,E.qh,{created:E.Sc},C.NR,K.nm,{created:K.qa},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.nX,E.DE,{created:E.oB},C.bh,R.i6,{created:R.IT},C.jRi,H.we,{"":H.ic},C.Xv,E.n5,{created:E.xx},C.KO,F.ZP,{created:F.Yw},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.dv},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.N0},C.ms,A.Bm,{created:A.yU},C.pK,D.Rk,{created:D.dP},C.lE,U.DK,{created:U.E5},C.ri,W.yy,{},C.Az,A.Gk,{created:A.Sy},C.X8,U.Ti,{created:U.lv},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.KM},C.XW,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
 I.$lazy($,"globalWindow","UW","My",function(){return $.jk().window})
 I.$lazy($,"globalWorker","uj","nB",function(){return $.jk().Worker})
@@ -17448,23 +18239,22 @@
 I.$lazy($,"nullLiteralPropertyPattern","tt","Bi",function(){return H.cM(function(){try{null.$method$}catch(z){return z.message}}())})
 I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.cM(H.Mj(void 0))})
 I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.cM(function(){try{(void 0).$method$}catch(z){return z.message}}())})
-I.$lazy($,"_completer","IQ","Xr",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_toStringList","qW","oM",function(){return[]})
-I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.C2()})
-I.$lazy($,"_toStringVisiting","xg","xb",function(){return P.yv(null)})
+I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
+I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
+I.$lazy($,"_toStringVisiting","nM","Ex",function(){return P.yv(null)})
 I.$lazy($,"_toStringList","yu","tw",function(){return[]})
 I.$lazy($,"webkitEvents","Ha","PO",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
-I.$lazy($,"context","Lt","ca",function(){return P.pL(function(){return this}())})
-I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","jl",function(){return init.getIsolateTag("_$dart_dartObject")})
+I.$lazy($,"context","Lt","ca",function(){return P.ND(function(){return this}())})
+I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
-I.$lazy($,"_freeColor","nK","aw",function(){return[255,255,255,255]})
+I.$lazy($,"_freeColor","nK","Rl",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","fM","Sd",function(){return[0,0,0,255]})
 I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.Rw)})
-I.$lazy($,"_logger","m0","OD",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","qr","V6",function(){return new L.ov([])})
+I.$lazy($,"_logger","y7","eI",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_instance","qr","V6",function(){return new L.Ul([])})
 I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.MdQ().$0()})
-I.$lazy($,"_logger","y7","Ku",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_logger","jz","T5",function(){return N.QM("observe.PathObserver")})
 I.$lazy($,"_pathCache","zC","fX",function(){return P.L5(null,null,null,P.qU,L.Tv)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
 I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
@@ -17474,32 +18264,32 @@
 I.$lazy($,"_reverseEventTranslations","fp","pT",function(){return new A.DOe().$0()})
 I.$lazy($,"_ATTRIBUTES_REGEX","vg","zZ",function(){return new H.VR("\\s|,",H.ol("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.ol("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_polymerSyntax","Df","J1",function(){var z=P.L5(null,null,null,P.qU,P.a)
+I.$lazy($,"_polymerSyntax","Df","XZ",function(){var z=P.L5(null,null,null,P.qU,P.a)
 z.FV(0,C.eu)
 return new A.N9(z)})
-I.$lazy($,"_ready","tS","mC",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
+I.$lazy($,"_ready","T6","ln",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_observeLog","DZ","dn",function(){return N.QM("polymer.observe")})
 I.$lazy($,"_eventsLog","mf","Uk",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","fV","RI",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","Q6","ZH",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_unbindLog","pH","EM",function(){return N.QM("polymer.unbind")})
+I.$lazy($,"_bindLog","f2","zB",function(){return N.QM("polymer.bind")})
 I.$lazy($,"_shadowHost","zr","c7",function(){return H.VM(new P.kM(null),[A.dM])})
-I.$lazy($,"_typeHandlers","lq","QL",function(){return P.EF([C.Db,new Z.Md(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.BQ,new Z.Ra(),C.yw,new Z.wJY(),C.AY,new Z.zOQ()],null,null)})
+I.$lazy($,"_typeHandlers","lq","QL",function(){return P.EF([C.Db,new Z.Md(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.BQ,new Z.Ra(),C.yw,new Z.wJY(),C.CR,new Z.zOQ()],null,null)})
 I.$lazy($,"_BINARY_OPERATORS","Af","Jl",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"*",new K.Raa(),"/",new K.w0(),"==",new K.w5(),"!=",new K.w10(),">",new K.w11(),">=",new K.w12(),"<",new K.w13(),"<=",new K.w14(),"||",new K.w15(),"&&",new K.w16(),"|",new K.w17()],null,null)})
 I.$lazy($,"_UNARY_OPERATORS","qM","qL",function(){return P.EF(["+",new K.w18(),"-",new K.w19(),"!",new K.w20()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","mb","vo",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentIsolateMatcher","cZ","Dw",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
 I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.ol("isolates/\\d+/",!1,!0,!1),null,null)})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
-I.$lazy($,"typeInspector","Yv","yQ",function(){return D.kP()})
+I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","b7",function(){return D.kP()})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.YJG().$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])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.W6o()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Qn","i8",function(){return"template, "+J.kl(C.z5.gvc(),new M.W6o()).zV(0,", ")})
 I.$lazy($,"_templateCreator","H8","rf",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.kM("template_binding"),[null])})
 
-init.functionAliases={Sa:166}
-init.metadata=["sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"b1",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.MN]},,"error","stackTrace",{func:"Ib",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"DZ",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","callback","captureThis","self","arguments","o",{func:"NT"},{func:"ZD",ret:P.a2,args:[P.IN]},"symbol",{func:"qq",ret:[P.cX,K.O1],args:[P.cX]},"iterable","invocation","f",{func:"ob",args:[P.EH]},"code",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.EP]},"exception","event","obj",{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"c3",args:[P.KN,P.KN]},"done",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail","target",{func:"Aw",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"Cm",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"arg","each",{func:"lv",args:[P.IN,null]},{func:"jK",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},"xhr",{func:"QO",void:true,args:[W.Oq]},"result",{func:"fK",args:[D.af]},{func:"XG",ret:O.Hz},"response",{func:"Q5",args:[D.vO]},"st",{func:"Sz",void:true,args:[W.ea,null,W.h4]},{func:"xo",ret:P.qU,args:[P.a2]},"newSpace",{func:"vO",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.cX,args:[{func:"pL",args:[P.qU]}]},{func:"Qd",ret:P.cX,args:[{func:"qt",ret:P.cX,args:[P.qU]}]},{func:"S0",void:true,args:[P.a2,null]},"expand",{func:"KDY",ret:[P.b8,D.af],args:[null]},{func:"Df",ret:P.qU,args:[G.Y2]},"m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type","s",{func:"DF",void:true,args:[P.a]},"records",{func:"kk",args:[L.Tv,null]},{func:"qx",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"WW",void:true,args:[W.ea]},"i","changes","model","node","oneTime",{func:"yF",args:[null,null,null]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},"k","v",{func:"oe",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.hw,U.hw]},{func:"qo",args:[U.hw]},{func:"Yg",ret:P.qU,args:[D.c2]},"line","map",{func:"JC",args:[V.qC]},{func:"If",ret:P.qU,args:[P.qU]},"id",{func:"rl",ret:P.b8},{func:"a0",void:true,args:[D.vO]},"coverage","scriptCoverage","timer",{func:"I0",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func","msg","details","x",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"vl",ret:[P.b8,V.qC],args:[P.qU]},];$=null
+init.functionAliases={Sa:183}
+init.metadata=["sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"cX",void:true,args:[P.xp,P.qK,P.xp,null,P.mE]},"self","parent","zone",{func:"QN",args:[P.xp,P.qK,P.xp,{func:"NT"}]},"f",{func:"wD",args:[P.xp,P.qK,P.xp,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.xp,P.qK,P.xp,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.xp,P.qK,P.xp,{func:"NT"}]},{func:"ie",ret:{func:"aB",args:[null]},args:[P.xp,P.qK,P.xp,{func:"aB",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.xp,P.qK,P.xp,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.xp,P.qK,P.xp,{func:"NT"}]},{func:"Uk",ret:P.Xa,args:[P.xp,P.qK,P.xp,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.xp,P.qK,P.xp,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Jj",ret:P.xp,args:[P.xp,P.qK,P.xp,P.aY,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"Z5",ret:P.a2,args:[P.IN]},"symbol",{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable","invocation",{func:"NT"},{func:"ob",args:[P.EH]},"code",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception","event","obj",{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"c3",args:[P.KN,P.KN]},"done",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail","target",{func:"lQ",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.mE]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"SF",args:[P.a2]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"N5",void:true,args:[null,P.mE]},"each",{func:"lv",args:[P.IN,null]},{func:"jK",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},"xhr",{func:"QO",void:true,args:[W.Oq]},"result",{func:"jH",args:[D.af]},{func:"XG",ret:O.Hz},"response",{func:"Q5",args:[D.vO]},"st",{func:"Sz",void:true,args:[W.ea,null,W.h4]},{func:"xo",ret:P.qU,args:[P.a2]},"newSpace",{func:"rI",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[P.qU]}]},{func:"pw",void:true,args:[P.a2,null]},"expand",{func:"KDY",ret:[P.b8,D.af],args:[null]},{func:"Df",ret:P.qU,args:[G.Y2]},"m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.qK,P.xp]},{func:"h2",args:[P.xp,P.qK,P.xp,{func:"aB",args:[null]}]},"x","s",{func:"DF",void:true,args:[P.a]},"records",{func:"kk",args:[L.Tv,null]},{func:"qx",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"WW",void:true,args:[W.ea]},"i","changes","model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"K7",void:true,args:[[P.WO,T.yj]]},"jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},"k","v",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.hw,U.hw]},{func:"Qc",args:[U.hw]},{func:"Yg",ret:P.qU,args:[D.c2]},"line","map",{func:"JC",args:[V.qC]},{func:"If",ret:P.qU,args:[P.qU]},"id",{func:"rl",ret:P.b8},{func:"a0",void:true,args:[D.vO]},"coverage","scriptCoverage","timer",{func:"Br",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func","msg","details",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"vl",ret:P.b8,args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -17545,7 +18335,7 @@
 return}if(document.currentScript){a(document.currentScript)
 return}var z=document.scripts
 function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.Tb(),b)},[])}else{(function(b){H.wW(E.Tb(),b)})([])}})
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.vS(),b)},[])}else{(function(b){H.wW(E.vS(),b)})([])}})
 function init(){I.p={}
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index ca3f4b2..952b8be 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -28,14 +28,9 @@
 
 <!-- Teach dart2js about Shadow DOM polyfill objects. -->
 
-
-<!-- Bootstrap the user application in a new isolate. -->
-
-<!-- TODO(sigmund): replace boot.js by boot.dart (dartbug.com/18007)
-<script type="application/dart">export "package:polymer/boot.dart";</script>
- -->
 <script src="packages/polymer/src/js/use_native_dartium_shadowdom.js"></script><script src="packages/web_components/platform.js"></script>
 <!-- <link rel="import" href="../polymer-dev/polymer.html"> -->
+
 <script src="packages/polymer/src/js/polymer/polymer.js"></script><polymer-element name="polymer-body" extends="body">
 
   <script>
@@ -126,7 +121,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -294,6 +294,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   
   
@@ -335,6 +339,7 @@
   
   
   
+  
 
   
 
@@ -448,7 +453,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -616,6 +626,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <style>
       .errorBox {
@@ -786,7 +800,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -954,6 +973,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <style>
       nav {
@@ -1213,7 +1236,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -1381,6 +1409,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -1467,7 +1499,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -1635,6 +1672,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 
@@ -1825,7 +1866,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -1993,6 +2039,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <div>
       <template if="{{ ref['static'] }}">static</template>
@@ -2072,7 +2122,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -2240,6 +2295,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style><!-- These comments are here to allow newlines.
      --><template if="{{ isDart }}"><!--
        --><template if="{{ qualified &amp;&amp; !hasParent &amp;&amp; hasClass }}"><!--
@@ -2312,7 +2371,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -2480,6 +2544,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <template if="{{ nameIsEmpty }}">
     <a href="{{ url }}">unnamed</a>
@@ -2553,7 +2621,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -2721,6 +2794,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
@@ -2786,7 +2863,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -2954,6 +3036,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -3153,7 +3239,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -3321,6 +3412,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
@@ -3400,7 +3495,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -3568,6 +3668,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <style>
       div.flex-row:hover {
@@ -3804,7 +3908,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -3972,6 +4081,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -4051,7 +4164,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -4219,6 +4337,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -4306,6 +4428,803 @@
   
   
   
+
+  
+  
+  
+  
+  
+<polymer-element name="stack-frame" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <div class="flex-row">
+      <div class="flex-item-fixed-1-12">
+      </div>
+      <div class="flex-item-fixed-1-12">
+        #{{ frame['depth'] }}
+      </div>
+      <div class="flex-item-fixed-9-12">
+        <function-ref ref="{{ frame['function'] }}"></function-ref>
+          ( <script-ref ref="{{ frame['script'] }}" pos="{{ frame['tokenPos'] }}">
+          </script-ref> )
+
+          <curly-block>
+            <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>
+      <div class="flex-item-fixed-1-12">
+      </div>
+    </div>
+  </template>
+  
+</polymer-element>
+<polymer-element name="flag-list" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <nav-menu link="{{ flagList.isolate.relativeHashLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content-centered">
+      <template if="{{ flagList['modifiedFlags'].isNotEmpty }}">
+        <h1>Modified Flags</h1>
+        <br>
+        <template repeat="{{ flag in flagList['modifiedFlags'] }}">
+          <flag-item flag="{{ flag }}"></flag-item>
+          <br>
+        </template>
+        <hr>
+      </template>
+
+      <h1>Unmodified Flags</h1>
+      <br>
+      <template if="{{ flagList['unmodifiedFlags'].isEmpty }}">
+        <em>None</em>
+      </template>
+      <template if="{{ flagList['unmodifiedFlags'].isNotEmpty }}">
+        <template repeat="{{ flag in flagList['unmodifiedFlags'] }}">
+          <flag-item flag="{{ flag }}"></flag-item>
+          <br>
+        </template>
+      </template>
+    </div>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="flag-item" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <span style="color:#aaa">// {{ flag['comment'] }}</span>
+    <div style="padding: 3px 0">
+      <b>{{ flag['name'] }}</b>
+      &nbsp;=&nbsp;
+      {{ flag['valueAsString'] }}
+    </div>
+  </template>
+</polymer-element>
+
+
+
+  
+  
+  
   
   
   
@@ -4418,7 +5337,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -4586,6 +5510,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -4756,7 +5684,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -4924,6 +5857,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <style>
     .hover {
@@ -5020,7 +5957,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -5188,6 +6130,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
 
     <nav-bar>
@@ -5205,12 +6151,298 @@
           <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
         </li>
       </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a>
+        </li>
+      </ul>
+
     </div>
     <br>
     <hr>
   </template>
 </polymer-element>
 
+<polymer-element name="io-ref" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <template if="{{ ref.serviceType == 'Socket' }}">
+      <io-socket-ref ref="{{ ref }}"></io-socket-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'HttpServer' }}">
+      <io-http-server-ref ref="{{ ref }}"></io-http-server-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'WebSocket' }}">
+      <io-web-socket-ref ref="{{ ref }}"></io-web-socket-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'Process' }}">
+      <io-process-ref ref="{{ ref }}"></io-process-ref>
+    </template>
+  </template>
+</polymer-element>
+
 <polymer-element name="io-http-server-list-view" extends="observatory-element">
   <template>
     <style>
@@ -5271,7 +6503,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -5439,6 +6676,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
 
     <nav-bar>
@@ -5524,7 +6765,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -5692,6 +6938,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <a href="{{ url }}">{{ name }}</a>
   </template>
@@ -5757,7 +7007,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -5925,6 +7180,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
 
     <nav-bar>
@@ -5939,6 +7198,10 @@
 
       <div class="memberList">
         <div class="memberItem">
+          <div class="memberName">Socket</div>
+          <div class="memberValue"><io-socket-ref ref="{{ httpServer['socket'] }}"></io-socket-ref></div>
+        </div>
+        <div class="memberItem">
           <div class="memberName">Address</div>
           <div class="memberValue">{{ httpServer['address'] }}</div>
         </div>
@@ -5961,6 +7224,3201 @@
   </template>
 </polymer-element>
 
+<polymer-element name="io-socket-ref" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-socket-list-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Sockets</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ socket in list['members'] }}">
+          <li class="list-group-item">
+            <io-socket-ref ref="{{ socket }}"></io-socket-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-socket-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <!-- Pipe Socket -->
+      <template if="{{ socket.isPipe }}">
+        <h1>Pipe Socket</h1>
+        <div class="memberList">
+          <template if="{{ socket.socketOwner != null }}">
+            <div class="memberItem">
+              <div class="memberName">Owner</div>
+              <div class="memberValue"><io-ref ref="{{ socket.socketOwner }}"></io-ref></div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">File descriptor</div>
+            <div class="memberValue">{{ socket.fd }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Read Closed</div>
+            <div class="memberValue">{{ socket.readClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Write Closed</div>
+            <div class="memberValue">{{ socket.writeClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Closing</div>
+            <div class="memberValue">{{ socket.closing }}</div>
+          </div>
+        </div>
+      </template>
+      <!-- Network Socket -->
+      <template if="{{ !socket.isPipe }}">
+        <h1>Network Socket</h1>
+        <div class="memberList">
+          <template if="{{ socket.socketOwner != null }}">
+            <div class="memberItem">
+              <div class="memberName">Owner</div>
+              <div class="memberValue"><io-ref ref="{{ socket.socketOwner }}"></io-ref></div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">Local Address</div>
+            <div class="memberValue">{{ socket.localAddress }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Local Port</div>
+            <div class="memberValue">{{ socket.localPort }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Remote Address</div>
+            <div class="memberValue">{{ socket.remoteAddress }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Remote Port</div>
+            <div class="memberValue">{{ socket.remotePort }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">File descriptor</div>
+            <div class="memberValue">{{ socket.fd }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Read Closed</div>
+            <div class="memberValue">{{ socket.readClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Write Closed</div>
+            <div class="memberValue">{{ socket.writeClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Closing</div>
+            <div class="memberValue">{{ socket.closing }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Listening</div>
+            <div class="memberValue">{{ socket.listening }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Protocol</div>
+            <div class="memberValue">{{ socket.protocol }}</div>
+          </div>
+        </div>
+      </template>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-ref" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-list-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>WebSockets</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ webSocket in list['members'] }}">
+          <li class="list-group-item">
+            <io-web-socket-ref ref="{{ webSocket }}"></io-web-socket-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>WebSocket</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Socket</div>
+          <div class="memberValue"><io-socket-ref ref="{{ webSocket['socket'] }}"></io-socket-ref></div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-ref" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-list-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Random Access Files</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ file in list['members'] }}">
+          <li class="list-group-item">
+            <io-random-access-file-ref ref="{{ file }}"></io-random-access-file-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Random Access File</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Path</div>
+          <div class="memberValue">{{ file['name'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Pending Operation</div>
+          <div class="memberValue">{{ file['asyncDispatched'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">File Descriptor</div>
+          <div class="memberValue">{{ file['fd'] }}</div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-list-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Processes</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ process in list['members'] }}">
+          <li class="list-group-item">
+            <io-process-ref ref="{{ process }}"></io-process-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-ref" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <template if="{{ small }}">
+      <a href="{{ url }}">{{ name }}</a>
+    </template>
+    <template if="{{ !small }}">
+      <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
+    </template>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-view" extends="observatory-element">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 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;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 100%;
+}
+
+.flex-item-10-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 10%;
+}
+
+.flex-item-15-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 15%;
+}
+
+.flex-item-20-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 20%;
+}
+
+.flex-item-30-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 30%;
+}
+
+.flex-item-40-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 40%;
+}
+
+.flex-item-60-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 60%;
+}
+
+.flex-item-70-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 70%;
+}
+
+.flex-item-80-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 80%;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Process</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Path</div>
+          <div class="memberValue">{{ process['name'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Pid</div>
+          <div class="memberValue">{{ process['pid'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Arguments</div>
+          <div class="memberValue">{{ process['arguments'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Started</div>
+          <div class="memberValue">{{ process['started'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Working Directory</div>
+          <div class="memberValue">{{ process['workingDirectory'] }}</div>
+        </div>
+        <template if="{{ process['stdin'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stdin</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stdin'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ process['stdout'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stdout</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stdout'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ process['stderr'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stderr</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stderr'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+      </div>
+
+      <br>
+
+      <h2>Environment</h2>
+      <div class="well">
+        <div class="monospace break-wrap">
+          <template repeat="{{ variable in process['environment'] }}">
+            {{ variable }}
+            <br>
+          </template>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
 
 
 
@@ -6023,7 +10481,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -6191,6 +10654,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
@@ -6263,7 +10730,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -6431,6 +10903,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <div class="flex-row">
       <div class="flex-item-10-percent">
@@ -6588,7 +11064,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -6756,6 +11237,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <template if="{{ isolate.error != null }}">
       <div class="content-centered">
@@ -6901,7 +11386,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -7069,6 +11559,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <style>
       .sourceInset {
@@ -7265,7 +11759,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -7433,6 +11932,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -7682,7 +12185,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -7850,6 +12358,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
 
     <nav-bar>
@@ -8063,7 +12575,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -8231,6 +12748,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <style>
     .table {
@@ -8494,7 +13015,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -8662,6 +13188,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -8905,7 +13435,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -9073,6 +13608,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
@@ -9099,271 +13638,6 @@
   
   
   
-
-  
-  
-  
-  
-  
-<polymer-element name="stack-frame" extends="observatory-element">
-  <template>
-    <style>
-/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 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;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style:italic;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-</style>
-    <div class="flex-row">
-      <div class="flex-item-fixed-1-12">
-      </div>
-      <div class="flex-item-fixed-1-12">
-        #{{ frame['depth'] }}
-      </div>
-      <div class="flex-item-fixed-9-12">
-        <function-ref ref="{{ frame['function'] }}"></function-ref>
-          ( <script-ref ref="{{ frame['script'] }}" pos="{{ frame['tokenPos'] }}">
-          </script-ref> )
-
-          <curly-block>
-            <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>
-      <div class="flex-item-fixed-1-12">
-      </div>
-    </div>
-  </template>
-  
-</polymer-element>
 <polymer-element name="stack-trace" extends="observatory-element">
   <template>
     <style>
@@ -9424,7 +13698,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -9592,6 +13871,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -9685,7 +13968,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -9853,6 +14141,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
 
     <nav-bar>
@@ -9879,6 +14171,12 @@
           <div class="memberName">asserts enabled</div>
           <div class="memberValue">{{ vm.assertsEnabled }}</div>
         </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="#/flags">flags</a>
+          </div>
+        </div>
       </div>
     </div>
 
@@ -9975,7 +14273,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -10143,6 +14446,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -10221,7 +14528,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -10389,6 +14701,10 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -10462,7 +14778,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -10630,13 +14951,17 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
 </style>
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 
 </polymer-element>
 
-<script src="main.dart.js"></script>
+
   <observatory-application devtools="true"></observatory-application>
 
 <script src="index_devtools.html_bootstrap.dart.js"></script></body></html>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html._data b/runtime/bin/vmservice/client/deployed/web/index_devtools.html._data
new file mode 100644
index 0000000..244ac94
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html._data
@@ -0,0 +1 @@
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/collapsible_content.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/response_viewer.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
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 f3c3c8e..0e32be3 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
@@ -119,11 +119,11 @@
 if(a1){b2+="="}else if(!a2){b2+=":"+b+":"+a4}b0[b5]=b2
 g[0].$reflectionName=b2
 g[0].$metadataIndex=a8+1
-if(a4)b3[b1+"*"]=g[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.qm("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.qm("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
-return e?function(f){if(h===null)h=H.qm(this,b,c,false,[f],d)
-return new h(this,b[0],f,d)}:function(){if(h===null)h=H.qm(this,b,c,false,[],d)
+if(a4)b3[b1+"*"]=g[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.kj("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.kj("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
+return e?function(f){if(h===null)h=H.kj(this,b,c,false,[f],d)
+return new h(this,b[0],f,d)}:function(){if(h===null)h=H.kj(this,b,c,false,[],d)
 return new h(this,b[0],null,d)}}function tearOff(b,c,d,e,f){var h
-return d?function(){if(h===void 0)h=H.qm(this,b,c,true,[],e).prototype
+return d?function(){if(h===void 0)h=H.kj(this,b,c,true,[],e).prototype
 return h}:y(b,c,e,f)}var z=0
 var y=typeof dart_precompiled=="function"?tearOffGetterCsp:tearOffGetterNoCsp
 if(!init.libraries)init.libraries=[]
@@ -181,7 +181,7 @@
 x=z+1
 if(x>=y.length)return H.e(y,x)
 return y[x]},
-Nq:function(a,b){var z,y,x
+YC:function(a,b){var z,y,x
 z=J.TZ(a)
 if(z==null)return
 y=$.Au
@@ -193,7 +193,7 @@
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
 bu:function(a){return H.a5(a)},
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,45],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,63],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
@@ -202,21 +202,21 @@
 giO:function(a){return a?519018:218159},
 gbx:function(a){return C.BQ},
 $isa2:true},
-Jh:{
+ht:{
 "^":"Gv;",
 n:function(a,b){return null==b},
 bu:function(a){return"null"},
 giO:function(a){return 0},
 gbx:function(a){return C.GX},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,45]},
-QI:{
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,63]},
+wm:{
 "^":"Gv;",
 giO:function(a){return 0},
 gbx:function(a){return C.CS}},
 iC:{
-"^":"QI;"},
-zH:{
-"^":"QI;"},
+"^":"wm;"},
+kdQ:{
+"^":"wm;"},
 Q:{
 "^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
@@ -224,7 +224,7 @@
 W4:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
 return a.splice(b,1)[0]},
-aP:function(a,b,c){if(b<0||b>a.length)throw H.b(P.N(b))
+xe:function(a,b,c){if(b<0||b>a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
 a.splice(b,0,c)},
 UG:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
@@ -234,12 +234,12 @@
 for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
 ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
-Ft:[function(a,b){return H.VM(new H.zs(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"Gb",ret:P.cX,args:[{func:"hT",ret:P.cX,args:[a]}]}},this.$receiver,"Q")},46],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},28],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.cX,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},46],
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},28],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -256,7 +256,7 @@
 return H.VM(a.slice(b,c),[H.Kp(a,0)])},
 Mu:function(a,b,c){H.xF(a,b,c)
 return H.j5(a,b,c,null)},
-gtH:function(a){if(a.length>0)return a[0]
+geK:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -269,13 +269,12 @@
 y=J.Wx(c)
 if(y.C(c,b)||y.D(c,z))throw H.b(P.TE(c,b,z))
 if(typeof c!=="number")return H.s(c)
-H.Gj(a,c,a,b,z-c)
+H.tb(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
 this.sB(a,z-(c-b))},
-Vr:function(a,b){return H.Ck(a,b)},
+Vr:function(a,b){return H.qo(a,b)},
 XP:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},
+H.rd(a,b)},
 Jd:function(a){return this.XP(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
 u8:function(a,b){return this.XU(a,b,0)},
@@ -286,7 +285,7 @@
 return!1},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-bu:function(a){return H.mx(a,"[","]")},
+bu:function(a){return P.WE(a,"[","]")},
 tt:function(a,b){var z
 if(b)return H.VM(a.slice(),[H.Kp(a,0)])
 else{z=H.VM(a.slice(),[H.Kp(a,0)])
@@ -311,8 +310,8 @@
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 P:{
 "^":"Gv;",
 iM:function(a,b){var z
@@ -336,11 +335,11 @@
 UD:function(a){if(a<0)return-Math.round(-a)
 else return Math.round(a)},
 Sy:function(a,b){var z
-if(b>20)throw H.b(P.C3(b))
+if(b>20)throw H.b(P.KP(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
 return z},
-WZ:function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
+WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:function(a){if(a===0&&1/a<0)return"-0.0"
 else return""+a},
@@ -391,7 +390,7 @@
 return a>=b},
 gbx:function(a){return C.yT},
 $isFK:true,
-static:{"^":"Ng,N6l"}},
+static:{"^":"SAz,N6l"}},
 L7:{
 "^":"P;",
 gbx:function(a){return C.yw},
@@ -420,7 +419,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)},
+if(w!==a.charCodeAt(x))return}return new H.Vo(c,b,a)},
 g:function(a,b){if(typeof b!=="string")throw H.b(P.u(b))
 return a+b},
 Tc:function(a,b){var z,y
@@ -484,10 +483,10 @@
 if(c+z>y)c=y-z
 return a.lastIndexOf(b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-Is:function(a,b,c){if(b==null)H.vh(P.u(null))
+eM:function(a,b,c){if(b==null)H.vh(P.u(null))
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 return H.m2(a,b,c)},
-tg:function(a,b){return this.Is(a,b,0)},
+tg:function(a,b){return this.eM(a,b,0)},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:function(a,b){var z
@@ -537,13 +536,13 @@
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
-x=P.L5(null,null,null,P.KN,H.zL)
+x=P.L5(null,null,null,P.KN,H.yo)
 w=P.Ls(null,null,null,P.KN)
-v=new H.zL(0,null,!1)
+v=new H.yo(0,null,!1)
 u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 w.h(0,0)
 u.O9(0,v)
-init.globalState.yc=u
+init.globalState.Nr=u
 init.globalState.N0=u
 y=H.G3()
 x=H.KT(y,[y]).BD(a)
@@ -566,20 +565,20 @@
 if(y!=null)return y[1]
 throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-z=H.Hh(b.data)
+z=H.Kh(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.oL=y.t(z,"id")
 x=y.t(z,"functionName")
 w=x==null?init.globalState.w2:init.globalFunctions[x]()
 v=y.t(z,"args")
-u=H.Hh(y.t(z,"msg"))
+u=H.Kh(y.t(z,"msg"))
 t=y.t(z,"isSpawnUri")
 s=y.t(z,"startPaused")
-r=H.Hh(y.t(z,"replyTo"))
+r=H.Kh(y.t(z,"replyTo"))
 y=init.globalState.Hg++
-q=P.L5(null,null,null,P.KN,H.zL)
+q=P.L5(null,null,null,P.KN,H.yo)
 p=P.Ls(null,null,null,P.KN)
-o=new H.zL(0,null,!1)
+o=new H.yo(0,null,!1)
 n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 p.h(0,0)
 n.O9(0,o)
@@ -614,7 +613,7 @@
 case"print":if(init.globalState.EF===!0){y=init.globalState.vd
 q=H.t0(P.EF(["command","print","msg",z],null,null))
 y.toString
-self.postMessage(q)}else P.mp(y.t(z,"msg"))
+self.postMessage(q)}else P.FL(y.t(z,"msg"))
 break
 case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,0,1],
 ZF:function(a){var z,y,x,w
@@ -622,12 +621,12 @@
 x=H.t0(P.EF(["command","log","msg",a],null,null))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
-z=new H.oP(w,null)
+z=new H.XO(w,null)
 throw H.b(P.FM(z))}},
 Di:function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
-$.z7=$.z7+("_"+y)
+$.H9=$.H9+("_"+y)
 $.eb=$.eb+("_"+y)
 y=z.EE
 x=init.globalState.N0.jO
@@ -642,20 +641,20 @@
 return z.Zo(a)}else{z=new H.Qt(new H.cx())
 z.mR=new H.aJ(null)
 return z.Zo(a)}},
-Hh:function(a){if(init.globalState.ji===!0)return new H.EU(null).ug(a)
+Kh:function(a){if(init.globalState.ji===!0)return new H.BV(null).ug(a)
 else return a},
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 PK:{
-"^":"Xs:47;a,b",
+"^":"Tp:64;a,b",
 $0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 JO:{
-"^":"Xs:47;a,c",
+"^":"Tp:64;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 f0:{
-"^":"a;Hg,oL,Y7,N0,yc,Xz,Ai,EF,ji,i2<,vd,XC,w2<",
+"^":"a;Hg,oL,Y7,N0,Nr,Xz,Ai,EF,ji,i2<,vd,XC,w2<",
 i6:function(a){var z,y,x,w
 z=$.My()==null
 y=$.nB()
@@ -677,7 +676,7 @@
 $.jk().onmessage=w
 $.jk().dartPrint=function(b){}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,Vp<,lJ,CN,M2,mf,pa,ir",
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,mf,pa,ir",
 V0:function(a,b){if(!this.um.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.PC()},
@@ -685,7 +684,7 @@
 if(!this.UF)return
 z=this.lJ
 z.Rz(0,a)
-if(z.X5===0){for(z=this.Vp;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
+if(z.X5===0){for(z=this.C9;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
 x=z.pop()
 y=init.globalState.Xz.Rk
 w=y.av
@@ -703,7 +702,7 @@
 IB:function(a){var z=this.CN
 if(z==null)return
 J.Dq(z,a)},
-MZ:function(a,b){if(!this.PX.n(0,a))return
+JZ:function(a,b){if(!this.PX.n(0,a))return
 this.pa=b},
 Wq:function(a,b){var z,y
 z=J.x(b)
@@ -731,11 +730,11 @@
 this.M2=z}z.NZ(this.gQb())},
 hk:function(a,b){var z,y
 z=this.ir
-if(z.X5===0){if(this.pa===!0&&this===init.globalState.yc)return
+if(z.X5===0){if(this.pa===!0&&this===init.globalState.Nr)return
 z=$.jk()
 if(z.console!=null&&typeof z.console.error=="function")z.console.error(a,b)
-else{P.mp(a)
-if(b!=null)P.mp(b)}return}y=Array(2)
+else{P.FL(a)
+if(b!=null)P.FL(b)}return}y=Array(2)
 y.fixed$length=init
 y[0]=J.AG(a)
 y[1]=b==null?null:J.AG(b)
@@ -748,13 +747,13 @@
 this.mf=!0
 try{y=b.$0()}catch(v){u=H.Ru(v)
 x=u
-w=new H.oP(v,null)
+w=new H.XO(v,null)
 this.hk(x,w)
 if(this.pa===!0){this.Dm()
-if(this===init.globalState.yc)throw v}}finally{this.mf=!1
+if(this===init.globalState.Nr)throw v}}finally{this.mf=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
-if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZ2",2,0,48,49],
+if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,65,66],
 Ds:function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.V0(z.t(a,1),z.t(a,2))
 break
@@ -764,7 +763,7 @@
 break
 case"remove-ondone":this.IB(z.t(a,1))
 break
-case"set-errors-fatal":this.MZ(z.t(a,1),z.t(a,2))
+case"set-errors-fatal":this.JZ(z.t(a,1),z.t(a,2))
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
@@ -790,10 +789,10 @@
 this.ir.V1(0)
 z=this.CN
 if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.m9(z.lo,null)
-this.CN=null}},"$0","gQb",0,0,13],
+this.CN=null}},"$0","gQb",0,0,15],
 $isaX:true},
 NY:{
-"^":"Xs:13;a",
+"^":"Tp:15;a",
 $0:[function(){J.m9(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
@@ -803,12 +802,12 @@
 return z.AR()},
 xB:function(){var z,y,x
 z=this.mj()
-if(z==null){if(init.globalState.yc!=null&&init.globalState.i2.x4(init.globalState.yc.jO)&&init.globalState.Ai===!0&&init.globalState.yc.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
+if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.Ai===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
 if(y.EF===!0&&y.i2.X5===0&&y.Xz.GL===0){y=y.vd
 x=H.t0(P.EF(["command","close"],null,null))
 y.toString
-self.postMessage(x)}return!1}z.Fn()
+self.postMessage(x)}return!1}J.R1(z)
 return!0},
 Wu:function(){if($.My()!=null)new H.QB(this).$0()
 else for(;this.xB(););},
@@ -816,29 +815,29 @@
 if(init.globalState.EF!==!0)this.Wu()
 else try{this.Wu()}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
+y=new H.XO(x,null)
 w=init.globalState.vd
 v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
 w.toString
 self.postMessage(v)}}},
 QB:{
-"^":"Xs:13;a",
+"^":"Tp:15;a",
 $0:[function(){if(!this.a.xB())return
-P.ww(C.RT,this)},"$0",null,0,0,null,"call"],
+P.ww(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,i3,G1>",
-Fn:function(){if(this.od.gUF()){this.od.gVp().push(this)
-return}J.Ok(this.od,this.i3)},
+Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
+return}J.QT(this.od,this.i3)},"$0","gNN",0,0,15],
 $isIY:true},
 JH:{
 "^":"a;"},
 mN:{
-"^":"Xs:47;a,b,c,d,e,f",
+"^":"Tp:64;a,b,c,d,e,f",
 $0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
 vK:{
-"^":"Xs:13;a,b,c,d,e",
+"^":"Tp:15;a,b,c,d,e",
 $0:[function(){var z,y,x
 this.e.sxF(!0)
 if(this.d!==!0)this.a.$1(this.c)
@@ -850,12 +849,12 @@
 if(y)z.$1(this.b)
 else z.$0()}}},"$0",null,0,0,null,"call"],
 $isEH:true},
-AY:{
+Iy4:{
 "^":"a;",
 $isRZ:true,
-$ishq:true},
+$iswC:true},
 Ze:{
-"^":"AY;JE,tv",
+"^":"Iy4;JE,tv",
 wR:function(a,b){var z,y,x,w,v
 z={}
 y=this.tv
@@ -875,16 +874,16 @@
 giO:function(a){return J.Mo(this.JE)},
 $isZe:true,
 $isRZ:true,
-$ishq:true},
+$iswC:true},
 Ua:{
-"^":"Xs:47;a,b,c",
+"^":"Tp:64;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
-y.a=H.Hh(y.a)}z.Rf(this.a.a)}},"$0",null,0,0,null,"call"],
+y.a=H.Kh(y.a)}z.Rf(this.a.a)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 dd:{
-"^":"AY;ZU,bv,tv",
+"^":"Iy4;ZU,bv,tv",
 wR:function(a,b){var z,y
 z=H.t0(P.EF(["command","message","port",this,"msg",b],null,null))
 if(init.globalState.EF===!0){init.globalState.vd.toString
@@ -893,15 +892,15 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isdd&&J.xC(this.ZU,b.ZU)&&J.xC(this.tv,b.tv)&&J.xC(this.bv,b.bv)},
 giO:function(a){var z,y,x
-z=J.Eh(this.ZU,16)
-y=J.Eh(this.tv,8)
+z=J.lf(this.ZU,16)
+y=J.lf(this.tv,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
 $isdd:true,
 $isRZ:true,
-$ishq:true},
-zL:{
+$iswC:true},
+yo:{
 "^":"a;x6>,D1,P0<",
 zd:function(a){return this.D1.$1(a)},
 pr:function(){this.P0=!0
@@ -917,10 +916,10 @@
 z.PC()},
 Rf:function(a){if(this.P0)return
 this.zd(a)},
-$iszL:true,
-static:{"^":"v0"}},
+$isyo:true,
+static:{"^":"Fd"}},
 RS:{
-"^":"Tf;Ao,mR",
+"^":"jP1;Ao,mR",
 DE:function(a){if(!!a.$isZe)return["sendport",init.globalState.oL,a.tv,J.Mo(a.JE)]
 if(!!a.$isdd)return["sendport",a.ZU,a.tv,a.bv]
 throw H.b("Illegal underlying port "+a.bu(0))},
@@ -933,7 +932,7 @@
 throw H.b("Illegal underlying port "+a.bu(0))},
 yf:function(a){if(!!a.$isiV)return new H.iV(a.x6)
 throw H.b("Capability not serializable: "+a.bu(0))}},
-EU:{
+BV:{
 "^":"lY;RZ",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
@@ -968,14 +967,14 @@
 if(H.vM(a))return this.Pq(a)
 this.mR.CH(0)
 z=null
-try{z=this.I8(a)}finally{this.mR.no()}return z},
-I8:function(a){var z
+try{z=this.Q9(a)}finally{this.mR.no()}return z},
+Q9: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(!!z.$isWO)return this.wb(a)
-if(!!z.$isZ0)return this.TI(a)
+if(!!z.$isZ0)return this.pi(a)
 if(!!z.$isRZ)return this.DE(a)
-if(!!z.$ishq)return this.yf(a)
+if(!!z.$iswC)return this.yf(a)
 return this.N1(a)},
 N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
@@ -989,9 +988,9 @@
 z=Array(x)
 z.fixed$length=init
 this.mR.u(0,a,z)
-for(w=0;w<x;++w)z[w]=this.I8(y.t(a,w))
+for(w=0;w<x;++w)z[w]=this.Q9(y.t(a,w))
 return z},
-TI:function(a){var z,y
+pi:function(a){var z,y
 z={}
 y=this.mR.t(0,a)
 z.a=y
@@ -1004,11 +1003,11 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Xs:50;a,b",
+"^":"Tp:67;a,b",
 $2:function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},
+J.kW(this.a.a,z.Q9(a),z.Q9(b))},
 $isEH:true},
-Tf:{
+jP1:{
 "^":"BB;",
 Pq:function(a){return a},
 wb:function(a){var z,y
@@ -1017,18 +1016,18 @@
 y=this.Ao++
 this.mR.u(0,a,y)
 return["list",y,this.mE(a)]},
-TI:function(a){var z,y
+pi:function(a){var z,y
 z=this.mR.t(0,a)
 if(z!=null)return["ref",z]
 y=this.Ao++
 this.mR.u(0,a,y)
-return["map",y,this.mE(J.qA(a.gvc())),this.mE(J.qA(a.gUQ(a)))]},
+return["map",y,this.mE(J.Nd(a.gvc())),this.mE(J.Nd(a.gUQ(a)))]},
 mE:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
 x=[]
 C.Nm.sB(x,y)
-for(w=0;w<y;++w){v=this.I8(z.t(a,w))
+for(w=0;w<y;++w){v=this.Q9(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
 x[w]=v}return x},
 DE:function(a){return H.vh(P.SY(null))},
@@ -1037,8 +1036,8 @@
 "^":"a;",
 ug:function(a){if(H.ZR(a))return a
 this.RZ=P.YM(null,null,null,null,null)
-return this.XE(a)},
-XE:function(a){var z,y
+return this.D5(a)},
+D5:function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
 switch(z.t(a,0)){case"ref":y=z.t(a,1)
@@ -1057,7 +1056,7 @@
 w=z.gB(x)
 if(typeof w!=="number")return H.s(w)
 v=0
-for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
+for(;v<w;++v)z.u(x,v,this.D5(z.t(x,v)))
 return x},
 en:function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
@@ -1071,7 +1070,7 @@
 if(typeof u!=="number")return H.s(u)
 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)))
+for(;s<u;++s)z.u(0,this.D5(y.t(w,s)),this.D5(t.t(v,s)))
 return z},
 PR:function(a){throw H.b("Unexpected serialized object")}},
 yH:{
@@ -1096,12 +1095,12 @@
 z.Qa(a,b)
 return z}}},
 Av:{
-"^":"Xs:13;a,b",
+"^":"Tp:15;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Wl:{
-"^":"Xs:13;c,d",
+"^":"Tp:15;c,d",
 $0:[function(){this.c.p9=null
 H.cv()
 this.d.$0()},"$0",null,0,0,null,"call"],
@@ -1126,7 +1125,7 @@
 y=b.x6
 return z==null?y==null:z===y}return!1},
 $isiV:true,
-$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
+$iswC:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1142,9 +1141,9 @@
 eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-rd:[function(a){throw H.b(P.cD(a))},"$1","yY",2,0,2],
+rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,2],
 BU:function(a,b,c){var z,y,x,w,v,u
-if(c==null)c=H.yY()
+if(c==null)c=H.kk()
 if(typeof a!=="string")H.vh(P.u(a))
 z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
 if(b==null){if(z!=null){y=z.length
@@ -1152,7 +1151,7 @@
 if(z[2]!=null)return parseInt(a,16)
 if(3>=y)return H.e(z,3)
 if(z[3]!=null)return parseInt(a,10)
-return c.$1(a)}b=10}else{if(b<2||b>36)throw H.b(P.C3("Radix "+H.d(b)+" not in range 2..36"))
+return c.$1(a)}b=10}else{if(b<2||b>36)throw H.b(P.KP("Radix "+H.d(b)+" not in range 2..36"))
 if(z!=null){if(b===10){if(3>=z.length)return H.e(z,3)
 y=z[3]!=null}else y=!1
 if(y)return parseInt(a,10)
@@ -1171,7 +1170,7 @@
 return parseInt(a,b)},
 RR:function(a,b){var z,y
 if(typeof a!=="string")H.vh(P.u(a))
-if(b==null)b=H.yY()
+if(b==null)b=H.kk()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
@@ -1199,7 +1198,7 @@
 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.Cb(z)},
-eT:function(a){var z,y
+BZ: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))
@@ -1216,7 +1215,7 @@
 if(typeof d!=="number"||Math.floor(d)!==d)H.vh(P.u(d))
 if(typeof e!=="number"||Math.floor(e)!==e)H.vh(P.u(e))
 if(typeof f!=="number"||Math.floor(f)!==f)H.vh(P.u(f))
-z=J.xH(b,1)
+z=J.Hn(b,1)
 y=h?Date.UTC(a,z,c,d,e,f,g):new Date(a,z,c,d,e,f,g).valueOf()
 if(isNaN(y)||y<-8640000000000000||y>8640000000000000)throw H.b(P.u(null))
 x=J.Wx(a)
@@ -1228,7 +1227,7 @@
 return a.date},
 of:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 return a[b]},
-wV:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+R0:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 a[b]=c},
 zo:function(a,b,c){var z,y,x
 z={}
@@ -1249,8 +1248,8 @@
 w=x.Rv
 if(w!==b.length)return H.zo(a,b,c)
 v=P.L5(null,null,null,null,null)
-for(u=x.Ee,t=0;t<u;++t){s=t+w
-v.u(0,x.QN(s),init.metadata[x.Fk(s)])}z.a=!1
+for(u=x.hG,t=0;t<u;++t){s=t+w
+v.u(0,x.KE(s),init.metadata[x.Fk(s)])}z.a=!1
 c.aN(0,new H.u8(z,v))
 if(z.a)return H.zo(a,b,c)
 C.Nm.FV(b,v.gUQ(v))
@@ -1288,7 +1287,7 @@
 u=$.KL()
 t=$.PH()
 s=$.D1()
-r=$.LC()
+r=$.rx()
 q=$.Kr()
 p=$.W6()
 $.Bi()
@@ -1344,13 +1343,13 @@
 if(d)v=function(){this.$initialize()}
 else if(typeof dart_precompiled=="function"){u=function(g,h,i,j){this.$initialize(g,h,i,j)}
 v=u}else{u=$.OK
-$.OK=J.WB(u,1)
+$.OK=J.ew(u,1)
 u=new Function("a","b","c","d","this.$initialize(a,b,c,d);"+u)
 v=u}w.constructor=v
 v.prototype=w
 u=!d
 if(u){t=e.length==1&&!0
-s=H.bx(a,z,t)
+s=H.SD(a,z,t)
 s.$reflectionInfo=c}else{w.$name=f
 s=z
 t=!1}if(typeof x=="number")r=function(g){return function(){return init.metadata[g]}}(x)
@@ -1360,7 +1359,7 @@
 w[y]=s
 for(u=b.length,p=1;p<u;++p){o=b[p]
 n=o.$callName
-if(n!=null){m=d?o:H.bx(a,o,t)
+if(n!=null){m=d?o:H.SD(a,o,t)
 w[n]=m}}w["call*"]=s
 return v},
 vq:function(a,b,c,d){var z=H.dS
@@ -1371,30 +1370,30 @@
 case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
 default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
-bx:function(a,b,c){var z,y,x,w,v,u
-if(c)return H.Hf(a,b)
+SD:function(a,b,c){var z,y,x,w,v,u
+if(c)return H.eT(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
 if(y===0){w=$.bf
-if(w==null){w=H.E2("self")
+if(w==null){w=H.Iq("self")
 $.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
-$.OK=J.WB(v,1)
+$.OK=J.ew(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
 v=$.bf
-if(v==null){v=H.E2("self")
+if(v==null){v=H.Iq("self")
 $.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
-$.OK=J.WB(w,1)
+$.OK=J.ew(w,1)
 return new Function(v+H.d(w)+"}")()},
 Z4:function(a,b,c,d){var z,y
 z=H.dS
 y=H.HY
-switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
+switch(b?-1:a){case 0:throw H.b(H.Yi("Intercepted function with no arguments."))
 case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
 case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
 case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
@@ -1404,10 +1403,10 @@
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
 return e.apply(f(this),h)}}(d,z,y)}},
-Hf:function(a,b){var z,y,x,w,v,u,t,s
-z=H.oN()
+eT:function(a,b){var z,y,x,w,v,u,t,s
+z=H.bO()
 y=$.P4
-if(y==null){y=H.E2("receiver")
+if(y==null){y=H.Iq("receiver")
 $.P4=y}x=b.$stubName
 w=b.length
 v=typeof dart_precompiled=="function"
@@ -1416,26 +1415,26 @@
 if(v||!t||w>=28)return H.Z4(w,!t,x,b)
 if(w===1){y="return function(){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+");"
 t=$.OK
-$.OK=J.WB(t,1)
+$.OK=J.ew(t,1)
 return new Function(y+H.d(t)+"}")()}s="abcdefghijklmnopqrstuvwxyz".split("").splice(0,w-1).join(",")
 y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
 t=$.OK
-$.OK=J.WB(t,1)
+$.OK=J.ew(t,1)
 return new Function(y+H.d(t)+"}")()},
-qm:function(a,b,c,d,e,f){b.fixed$length=init
+kj:function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
 return H.HA(a,b,c,!!d,e,f)},
-SE:function(a,b){var z=J.U6(b)
-throw H.b(H.Ep(H.lh(a),z.Nj(b,3,z.gB(b))))},
+aE:function(a,b){var z=J.U6(b)
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},
 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)},
+H.aE(a,b)},
 ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 Og:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.tu(z)
+if(b==null||b.length===0)return new H.Fp(z)
 return new H.Tu(z,b,null)},
 G3:function(){return C.KZ},
 IL:function(a){return new H.cu(a,null)},
@@ -1551,9 +1550,9 @@
 n=u[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
 ml:function(a,b,c){return a.apply(b,c)},
-kj:function(a){var z=$.NF
+Pq:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
-KS:function(a){return H.eQ(a)},
+wzi:function(a){return H.eQ(a)},
 bm:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
 w3:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
@@ -1614,7 +1613,7 @@
 z["*"+v]=s}}},
 kO:function(){var z,y,x,w,v,u,t
 z=C.MA()
-z=H.ud(C.JS,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ku(C.w2),z)))))))
+z=H.ud(C.mp,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ku(C.w2),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
 if(typeof y=="function")y=[y]
 if(y.constructor==Array)for(x=0;x<y.length;++x){w=y[x]
@@ -1622,8 +1621,8 @@
 u=z.getUnknownTag
 t=z.prototypeForTag
 $.NF=new H.dC(v)
-$.TX=new H.wN(u)
-$.x7=new H.VX(t)},
+$.TX=new H.VX(u)
+$.x7=new H.vZ(t)},
 ud:function(a,b){return a(b)||b},
 ZT:function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
@@ -1631,7 +1630,7 @@
 x=a.length
 for(w=0;!0;){v=C.xB.XU(b,a,w)
 if(v===-1)break
-z.push(new H.tQ(v,b,a))
+z.push(new H.Vo(v,b,a))
 u=v+x
 if(u===y)break
 else w=v===u?w+1:u}return z},
@@ -1640,7 +1639,7 @@
 else{z=J.x(b)
 if(!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.z4(z.dd(b,C.xB.yn(a,c)))}},
+return y.test(z)}else return J.yx(z.dd(b,C.xB.yn(a,c)))}},
 ys:function(a,b,c){var z,y,x,w
 if(b==="")if(a==="")return c
 else{z=P.p9("")
@@ -1675,8 +1674,8 @@
 gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
 hY:{
-"^":"Xs:30;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,51,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,68,"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -1710,8 +1709,8 @@
 v.u(0,new H.GD(t),x[s])}return v},
 static:{"^":"hAw,eHF,zl"}},
 FD:{
-"^":"a;mr,Rn>,XZ,Rv,Ee,Mo,AM,NE",
-XL:function(a){var z=this.Rn[a+this.Ee+3]
+"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
+XL:function(a){var z=this.Rn[a+this.hG+3]
 return init.metadata[z]},
 BX:function(a,b){var z=this.Rv
 if(typeof b!=="number")return b.C()
@@ -1719,27 +1718,26 @@
 return this.Rn[3+b-z]},
 Fk:function(a){var z=this.Rv
 if(a<z)return
-if(!this.Mo||this.Ee===1)return this.BX(0,a)
+if(!this.Mo||this.hG===1)return this.BX(0,a)
 return this.BX(0,this.e4(a-z))},
-QN:function(a){var z=this.Rv
+KE:function(a){var z=this.Rv
 if(a<z)return
-if(!this.Mo||this.Ee===1)return this.XL(a)
+if(!this.Mo||this.hG===1)return this.XL(a)
 return this.XL(this.e4(a-z))},
-e4:function(a){var z,y,x,w,v,u,t
+e4:function(a){var z,y,x,w,v,u
 z={}
-if(this.NE==null){y=this.Ee
+if(this.NE==null){y=this.hG
 this.NE=Array(y)
 x=P.Fl(P.qU,P.KN)
 for(w=this.Rv,v=0;v<y;++v){u=w+v
 x.u(0,this.XL(u),u)}z.a=0
 y=x.gvc()
 y=P.F(y,!0,H.ip(y,"mW",0))
-t=P.n4()
-H.ZE(y,0,y.length-1,t)
+H.rd(y,null)
 H.bQ(y,new H.uV(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
 return z[a]},
-static:{"^":"t4,FV,OcN,yM",zh:function(a){var z,y,x
+static:{"^":"t4A,FV,OcN,yM",zh:function(a){var z,y,x
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
@@ -1748,7 +1746,7 @@
 x=z[1]
 return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 uV:{
-"^":"Xs:2;a,b,c",
+"^":"Tp:2;a,b,c",
 $1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
@@ -1757,14 +1755,14 @@
 z[y]=x},
 $isEH:true},
 lk:{
-"^":"Xs:52;a,b,c",
+"^":"Tp:69;a,b,c",
 $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},
 $isEH:true},
 u8:{
-"^":"Xs:52;a,b",
+"^":"Tp:69;a,b",
 $2:function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
 else this.a.a=!0},
@@ -1786,7 +1784,7 @@
 x=this.cR
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,k1,Re,fN,GK,rZ,BX,tt,dt,A7",cM:function(a){var z,y,x,w,v,u
+static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",cM: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)
 if(z==null)z=[]
@@ -1798,21 +1796,21 @@
 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)},S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
 try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
 Zo:{
-"^":"XS;V7,Ga",
+"^":"XS;K9,Ga",
 bu:function(a){var z=this.Ga
-if(z==null)return"NullError: "+H.d(this.V7)
+if(z==null)return"NullError: "+H.d(this.K9)
 return"NullError: Cannot call \""+H.d(z)+"\" on null"},
-$isMC:true,
+$isJS:true,
 $isXS:true},
 u0:{
-"^":"XS;V7,Ga,cR",
+"^":"XS;K9,Ga,cR",
 bu:function(a){var z,y
 z=this.Ga
-if(z==null)return"NoSuchMethodError: "+H.d(this.V7)
+if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
 y=this.cR
-if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.V7)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.V7)+")"},
-$isMC:true,
+if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},
+$isJS:true,
 $isXS:true,
 static:{T3:function(a,b){var z,y
 z=b==null
@@ -1820,15 +1818,15 @@
 z=z?null:b.receiver
 return new H.u0(a,y,z)}}},
 vV:{
-"^":"XS;V7",
-bu:function(a){var z=this.V7
+"^":"XS;K9",
+bu:function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},
 $isEH:true},
-oP:{
+XO:{
 "^":"a;lA,ui",
 bu:function(a){var z,y
 z=this.ui
@@ -1839,32 +1837,32 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Xs:47;a",
+"^":"Tp:64;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Xs:47;b,c",
+"^":"Tp:64;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"Xs:47;d,e,f",
+"^":"Tp:64;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"Xs:47;UI,bK,Gq,Rm",
+"^":"Tp:64;UI,bK,Gq,Rm",
 $0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
 Qx:{
-"^":"Xs:47;w3,HZ,mG,xC,pb",
-$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.pb)},
+"^":"Tp:64;w3,HZ,mG,xC,cj",
+$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
-Xs:{
+Tp:{
 "^":"a;",
 bu:function(a){return"Closure"},
 $isEH:true,
 gKu:function(){return this}},
 Bp:{
-"^":"Xs;"},
+"^":"Tp;"},
 v:{
 "^":"Bp;nw,jm,cR,RA",
 n:function(a,b){if(b==null)return!1
@@ -1877,9 +1875,9 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"bf,P4",dS:function(a){return a.nw},HY:function(a){return a.cR},oN:function(){var z=$.bf
-if(z==null){z=H.E2("self")
-$.bf=z}return z},E2:function(a){var z,y,x,w,v
+static:{"^":"bf,P4",dS:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
+if(z==null){z=H.Iq("self")
+$.bf=z}return z},Iq:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
@@ -1890,11 +1888,11 @@
 "^":"XS;G1>",
 bu:function(a){return this.G1},
 $isXS:true,
-static:{Ep:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
-tc:{
+static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
+bb:{
 "^":"XS;G1>",
 bu:function(a){return"RuntimeError: "+H.d(this.G1)},
-static:{Ef:function(a){return new H.tc(a)}}},
+static:{Yi:function(a){return new H.bb(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
@@ -1933,7 +1931,7 @@
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
 x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
-static:{"^":"UA",Dz:function(a){var z,y,x
+static:{"^":"lcs",Dz:function(a){var z,y,x
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
@@ -1943,7 +1941,7 @@
 bu:function(a){return"dynamic"},
 za:function(){return},
 $ishJ:true},
-tu:{
+Fp:{
 "^":"lbp;oc>",
 za:function(){var z,y
 z=this.oc
@@ -1978,20 +1976,20 @@
 $iscu:true,
 $isuq:true},
 dC:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a(a)},
 $isEH:true},
-wN:{
-"^":"Xs:53;b",
+VX:{
+"^":"Tp:70;b",
 $2:function(a,b){return this.b(a,b)},
 $isEH:true},
-VX:{
-"^":"Xs:2;c",
+vZ:{
+"^":"Tp:2;c",
 $1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
 "^":"a;zO,Ej,BT,xJ",
-gl9:function(){var z=this.BT
+gF4:function(){var z=this.BT
 if(z!=null)return z
 z=this.Ej
 z=H.ol(this.zO,z.multiline,!z.ignoreCase,!0)
@@ -2007,16 +2005,16 @@
 if(typeof a!=="string")H.vh(P.u(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.rj(this,z)},
+return H.Mr(this,z)},
 zD:function(a){if(typeof a!=="string")H.vh(P.u(a))
 return this.Ej.test(a)},
 dd:function(a,b){return new H.KW(this,b)},
 yk:function(a,b){var z,y
-z=this.gl9()
+z=this.gF4()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.rj(this,y)},
+return H.Mr(this,y)},
 Bh:function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -2027,7 +2025,7 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 C.Nm.sB(y,w)
-return H.rj(this,y)},
+return H.Mr(this,y)},
 wL:function(a,b,c){var z
 if(c>=0){z=J.q8(b)
 if(typeof z!=="number")return H.s(z)
@@ -2036,7 +2034,7 @@
 return this.Bh(b,c)},
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
-$iswL:true,
+$isKx:true,
 static:{ol:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
@@ -2052,14 +2050,14 @@
 return z[b]},
 Ko:function(a,b){},
 $isOd:true,
-static:{rj:function(a,b){var z=new H.AX(a,b)
+static:{Mr:function(a,b){var z=new H.AX(a,b)
 z.Ko(a,b)
 return z}}},
 KW:{
 "^":"mW;rN,rv",
 gA:function(a){return new H.Pb(this.rN,this.rv,null)},
 $asmW:function(){return[P.Od]},
-$ascX:function(){return[P.Od]}},
+$asQV:function(){return[P.Od]}},
 Pb:{
 "^":"a;xz,rv,Wh",
 gl:function(){return this.Wh},
@@ -2077,62 +2075,67 @@
 this.Wh=z
 if(z==null){this.rv=null
 return!1}return!0}},
-tQ:{
-"^":"a;M,J9,zO",
+Vo:{
+"^":"a;M,f1,zO",
 t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
 return this.zO},
 $isOd:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
 "^":"",
 hV:{
-"^":"LP;IF,Qw,cw,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gv8:function(a){return a.IF},
-sv8:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
-gFR:function(a){return a.Qw},
+"^":"LPc;fi,dB,KW,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gv8:function(a){return a.fi},
+sv8:function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},
+gFR:function(a){return a.dB},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
-gph:function(a){return a.cw},
-sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
-pp:[function(a,b,c,d){var z=a.IF
+sFR:function(a,b){a.dB=this.ct(a,C.AV,a.dB,b)},
+gph:function(a){return a.KW},
+sph:function(a,b){a.KW=this.ct(a,C.hf,a.KW,b)},
+F6:[function(a,b,c,d){var z=a.fi
 if(z===!0)return
-if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
-this.LY(a,null).wM(new X.jE(a))}},"$3","gNa",6,0,54,22,23,55],
+if(a.dB!=null){a.fi=this.ct(a,C.S4,z,!0)
+this.LY(a,null).wM(new X.jE(a))}},"$3","gNa",6,0,71,43,44,72],
 static:{zy:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.IF=!1
-a.Qw=null
-a.cw="action"
+a.fi=!1
+a.dB=null
+a.KW="action"
 a.on=z
 a.BA=y
 a.LL=w
 C.Gx.ZL(a)
 C.Gx.XI(a)
 return a}}},
-LP:{
+LPc:{
 "^":"ir+Pi;",
 $isd3:true},
 jE:{
-"^":"Xs:47;a",
+"^":"Tp:64;a",
 $0:[function(){var z=this.a
-z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
+z.fi=J.Q5(z,C.S4,z.fi,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
+m7:[function(a){var z
+N.QM("").To("Google Charts API loaded")
+z=J.UQ(J.UQ($.ca(),"google"),"visualization")
+$.BY=z
+return z},"$1","vN",2,0,10,11],
 dj:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"},
 o1:function(a,b){var z
 for(z="";b>1;){--b
 if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
-DD:[function(a){var z,y,x
+le:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
 y=z.Y(a,1000)
 a=z.Z(a,1000)
 x=G.o1(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","xo",2,0,10],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","kh",2,0,12],
 P0:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.UD(a*1000))
 y=C.jn.cU(z,3600000)
@@ -2143,12 +2146,12 @@
 z=C.jn.Y(z,1000)
 if(y>0)return G.o1(y,2)+":"+G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)
 else return G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)},
-Xz:[function(a){var z=J.Wx(a)
+Ef:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
 else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
 else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","Gt",2,0,10,11],
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","Fx",2,0,12,13],
 mG:function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
@@ -2176,9 +2179,9 @@
 z=z.Li
 H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
 kj:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
-window.location.hash=""},"$1","gbf",2,0,56,19],
+window.location.hash=""},"$1","gbf",2,0,73,21],
 t1:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
-window.location.hash=""},"$1","gXa",2,0,57,58],
+window.location.hash=""},"$1","gXa",2,0,74,75],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
 Kf:{
@@ -2186,15 +2189,15 @@
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
 B7:function(){var z=this.Yb
-z.K9("removeRows",[0,z.nQ("getNumberOfRows")])},
+z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
 Id:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
-this.Yb.K9("addRow",[H.VM(new P.Tz(z),[null])])}},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])}},
 qu:{
 "^":"a;vR,bG",
-Am:function(a){var z=P.ND(P.M0(this.bG))
-this.vR.K9("draw",[a.Yb,z])}},
-dZ:{
+W2:function(a){var z=P.jT(this.bG)
+this.vR.V7("draw",[a.Yb,z])}},
+hq:{
 "^":"Pi;ec,JL,AP,fn",
 kI:function(){var z=H.VM(new W.RO(window,C.yZ.Ph,!1),[null])
 H.VM(new W.fd(0,z.bi,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
@@ -2210,20 +2213,20 @@
 if(0>=z)return H.e(y,0)
 x=z>1?y[1]:""
 if(z>2)N.QM("").j2("Found more than 2 #-characters in "+H.d(this.JL))
-this.ec.wv.ox(J.ZZ(this.JL,2)).ml(new G.wX(this,x))},
-static:{"^":"xp"}},
+this.ec.wv.cv(J.ZZ(this.JL,2)).ml(new G.wX(this,x))},
+static:{"^":"K3D"}},
 Qe:{
-"^":"Xs:30;a",
-$1:[function(a){this.a.df()},"$1",null,2,0,null,59,"call"],
+"^":"Tp:10;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,76,"call"],
 $isEH:true},
 wX:{
-"^":"Xs:30;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=z.ec
 y.AJ=F.Wi(y,C.F3,y.AJ,a)
 z=z.ec
-z.fz=F.Wi(z,C.Za,z.fz,this.b)},"$1",null,2,0,null,60,"call"],
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,77,"call"],
 $isEH:true},
 Y2:{
 "^":"Pi;eT>,yt<,ks>,oH<",
@@ -2242,6 +2245,12 @@
 $isY2:true},
 XN:{
 "^":"Pi;WT>,AP,fn",
+qU:function(a){var z,y,x
+z=this.WT
+y=J.U6(z)
+x=y.t(z,a)
+if(x.r8()===!0)y.UG(z,y.u8(z,x)+1,J.Mx(x))
+else this.FS(x)},
 FS:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gks(a))
@@ -2252,1481 +2261,1654 @@
 w=J.U6(z)
 v=w.u8(z,a)+1
 w.UZ(z,v,v+y)}},
-YA:{
+zb:{
 "^":"a;ph>,xy<",
-static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,12]}},
+static:{mb:[function(a){return a!=null?J.AG(a):"<null>"},"$1","HP",2,0,14]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
 Vz:{
-"^":"Pi;oH<,WT>,tW,pT,jV,AP,fn",
+"^":"Pi;oH<,WT>,c8,pT,jV,AP,fn",
 sxp:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
 gxp:function(){return this.pT},
-Jd:function(a){var z=this.tW
-H.ZE(z,0,z.length-1,new G.BD(this))
+Jd:function(a){H.rd(this.c8,new G.BD(this))
 F.Wi(this,C.DW,0,1)},
-gGD:function(){return this.tW},
+gGD:function(){return this.c8},
 B7:function(){C.Nm.sB(this.WT,0)
-C.Nm.sB(this.tW,0)},
+C.Nm.sB(this.c8,0)},
 Id:function(a,b){var z=this.WT
-this.tW.push(z.length)
+this.c8.push(z.length)
 z.push(b)
 F.Wi(this,C.DW,0,1)},
 tM:[function(a,b){var z,y
 z=this.WT
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-y=J.UQ(J.U8(z[a]),b)
+y=J.UQ(J.U8o(z[a]),b)
 z=this.oH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b].gxy().$1(y)},"$2","gwy",4,0,61,62,63],
+return z[b].gxy().$1(y)},"$2","gwy",4,0,78,79,80],
 Qs:[function(a){var z
 if(!J.xC(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.WB(J.Q4(z[a]),"\u2003")}z=this.oH
+return J.ew(J.Q4(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.Q4(z[a])
-return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,10,63],
+return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,12,80],
 TK:[function(a,b){var z=this.WT
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8(z[a]),b)},"$2","gyY",4,0,64,62,63]},
+return J.UQ(J.U8o(z[a]),b)},"$2","gyY",4,0,81,79,80]},
 BD:{
-"^":"Xs:50;a",
+"^":"Tp:67;a",
 $2:function(a,b){var z,y,x,w
 z=this.a
 y=z.WT
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
-x=J.UQ(J.U8(y[a]),z.pT)
+x=J.UQ(J.U8o(y[a]),z.pT)
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
-w=J.UQ(J.U8(y[b]),z.pT)
+w=J.UQ(J.U8o(y[b]),z.pT)
 if(z.jV)return J.oE(w,x)
 else return J.oE(x,w)},
 $isEH:true}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
 "^":"",
-Id:[function(){var z,y,x,w,v
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.WC,new E.wa(),C.S4,new E.Or(),C.Ro,new E.YL(),C.AV,new E.wf(),C.C0,new E.Oa(),C.eZ,new E.emv(),C.bk,new E.Lbd(),C.lH,new E.QAa(),C.kG,new E.CvS(),C.OI,new E.edy(),C.XA,new E.waE(),C.i4,new E.Ore(),C.qt,new E.YLa(),C.p1,new E.wfa(),C.bJ,new E.Oaa(),C.ox,new E.e0(),C.WZ,new E.e1(),C.i0,new E.e2(),C.iE,new E.e3(),C.f4,new E.e4(),C.VK,new E.e5(),C.aH,new E.e6(),C.PI,new E.e7(),C.aK,new E.e8(),C.GP,new E.e9(),C.Gr,new E.e10(),C.tP,new E.e11(),C.yh,new E.e12(),C.Zb,new E.e13(),C.u7,new E.e14(),C.ne,new E.e15(),C.B0,new E.e16(),C.r1,new E.e17(),C.mr,new E.e18(),C.Ek,new E.e19(),C.Pn,new E.e20(),C.YT,new E.e21(),C.WQ,new E.e22(),C.Gd,new E.e23(),C.FP,new E.e24(),C.kF,new E.e25(),C.UD,new E.e26(),C.Aq,new E.e27(),C.DS,new E.e28(),C.C9,new E.e29(),C.VF,new E.e30(),C.uU,new E.e31(),C.YJ,new E.e32(),C.eF,new E.e33(),C.oI,new E.e34(),C.ST,new E.e35(),C.QH,new E.e36(),C.qX,new E.e37(),C.rE,new E.e38(),C.nf,new E.e39(),C.pO,new E.e40(),C.EI,new E.e41(),C.JB,new E.e42(),C.Uq,new E.e43(),C.A8,new E.e44(),C.Ql,new E.e45(),C.SI,new E.e46(),C.zS,new E.e47(),C.ak,new E.e48(),C.eo,new E.e49(),C.Ge,new E.e50(),C.He,new E.e51(),C.wq,new E.e52(),C.k6,new E.e53(),C.oj,new E.e54(),C.PJ,new E.e55(),C.Ms,new E.e56(),C.q2,new E.e57(),C.d2,new E.e58(),C.kN,new E.e59(),C.fn,new E.e60(),C.eJ,new E.e61(),C.iG,new E.e62(),C.Py,new E.e63(),C.uu,new E.e64(),C.qs,new E.e65(),C.h7,new E.e66(),C.I9,new E.e67(),C.C1,new E.e68(),C.a0,new E.e69(),C.Yg,new E.e70(),C.bR,new E.e71(),C.ai,new E.e72(),C.ob,new E.e73(),C.Iv,new E.e74(),C.Wg,new E.e75(),C.tD,new E.e76(),C.nZ,new E.e77(),C.Of,new E.e78(),C.pY,new E.e79(),C.Lk,new E.e80(),C.dK,new E.e81(),C.xf,new E.e82(),C.rB,new E.e83(),C.bz,new E.e84(),C.Jx,new E.e85(),C.b5,new E.e86(),C.Lc,new E.e87(),C.hf,new E.e88(),C.uk,new E.e89(),C.kA,new E.e90(),C.Wn,new E.e91(),C.ur,new E.e92(),C.VN,new E.e93(),C.EV,new E.e94(),C.VI,new E.e95(),C.eh,new E.e96(),C.SA,new E.e97(),C.kV,new E.e98(),C.vp,new E.e99(),C.DY,new E.e100(),C.wT,new E.e101(),C.SR,new E.e102(),C.t6,new E.e103(),C.rP,new E.e104(),C.pX,new E.e105(),C.VD,new E.e106(),C.NN,new E.e107(),C.UX,new E.e108(),C.YS,new E.e109(),C.pu,new E.e110(),C.So,new E.e111(),C.EK,new E.e112(),C.td,new E.e113(),C.Gn,new E.e114(),C.zO,new E.e115(),C.eH,new E.e116(),C.ap,new E.e117(),C.Ys,new E.e118(),C.zm,new E.e119(),C.XM,new E.e120(),C.Ic,new E.e121(),C.yG,new E.e122(),C.tW,new E.e123(),C.CG,new E.e124(),C.vb,new E.e125(),C.UL,new E.e126(),C.QK,new E.e127(),C.AO,new E.e128(),C.xP,new E.e129(),C.Wm,new E.e130(),C.GR,new E.e131(),C.KX,new E.e132(),C.ja,new E.e133(),C.Dj,new E.e134(),C.Gi,new E.e135(),C.X2,new E.e136(),C.F3,new E.e137(),C.UY,new E.e138(),C.Aa,new E.e139(),C.nY,new E.e140(),C.HD,new E.e141(),C.iU,new E.e142(),C.eN,new E.e143(),C.ue,new E.e144(),C.nh,new E.e145(),C.L2,new E.e146(),C.Gs,new E.e147(),C.bE,new E.e148(),C.YD,new E.e149(),C.PX,new E.e150(),C.N8,new E.e151(),C.EA,new E.e152(),C.oW,new E.e153(),C.hd,new E.e154(),C.XY,new E.e155(),C.kz,new E.e156(),C.DW,new E.e157(),C.PM,new E.e158(),C.Nv,new E.e159(),C.TW,new E.e160(),C.xS,new E.e161(),C.mi,new E.e162(),C.zz,new E.e163(),C.hO,new E.e164(),C.ei,new E.e165(),C.HK,new E.e166(),C.je,new E.e167(),C.hN,new E.e168(),C.Q1,new E.e169(),C.ID,new E.e170(),C.z6,new E.e171(),C.bc,new E.e172(),C.kw,new E.e173(),C.ep,new E.e174(),C.J2,new E.e175(),C.zU,new E.e176(),C.bn,new E.e177(),C.mh,new E.e178(),C.Fh,new E.e179(),C.jh,new E.e180(),C.xw,new E.e181(),C.zn,new E.e182(),C.RJ,new E.e183(),C.Tc,new E.e184()],null,null)
-y=P.EF([C.aP,new E.e185(),C.cg,new E.e186(),C.j2,new E.e187(),C.S4,new E.e188(),C.AV,new E.e189(),C.bk,new E.e190(),C.lH,new E.e191(),C.kG,new E.e192(),C.XA,new E.e193(),C.i4,new E.e194(),C.bJ,new E.e195(),C.WZ,new E.e196(),C.VK,new E.e197(),C.aH,new E.e198(),C.PI,new E.e199(),C.Gr,new E.e200(),C.tP,new E.e201(),C.yh,new E.e202(),C.Zb,new E.e203(),C.ne,new E.e204(),C.B0,new E.e205(),C.mr,new E.e206(),C.YT,new E.e207(),C.WQ,new E.e208(),C.Gd,new E.e209(),C.QH,new E.e210(),C.rE,new E.e211(),C.nf,new E.e212(),C.Ql,new E.e213(),C.ak,new E.e214(),C.eo,new E.e215(),C.Ge,new E.e216(),C.He,new E.e217(),C.oj,new E.e218(),C.Ms,new E.e219(),C.d2,new E.e220(),C.fn,new E.e221(),C.Py,new E.e222(),C.uu,new E.e223(),C.qs,new E.e224(),C.a0,new E.e225(),C.rB,new E.e226(),C.Lc,new E.e227(),C.hf,new E.e228(),C.uk,new E.e229(),C.kA,new E.e230(),C.ur,new E.e231(),C.EV,new E.e232(),C.eh,new E.e233(),C.SA,new E.e234(),C.kV,new E.e235(),C.vp,new E.e236(),C.SR,new E.e237(),C.t6,new E.e238(),C.UX,new E.e239(),C.YS,new E.e240(),C.td,new E.e241(),C.zO,new E.e242(),C.Ys,new E.e243(),C.XM,new E.e244(),C.Ic,new E.e245(),C.tW,new E.e246(),C.vb,new E.e247(),C.QK,new E.e248(),C.AO,new E.e249(),C.xP,new E.e250(),C.GR,new E.e251(),C.KX,new E.e252(),C.ja,new E.e253(),C.Dj,new E.e254(),C.X2,new E.e255(),C.F3,new E.e256(),C.UY,new E.e257(),C.Aa,new E.e258(),C.nY,new E.e259(),C.HD,new E.e260(),C.iU,new E.e261(),C.eN,new E.e262(),C.Gs,new E.e263(),C.bE,new E.e264(),C.YD,new E.e265(),C.PX,new E.e266(),C.XY,new E.e267(),C.PM,new E.e268(),C.Nv,new E.e269(),C.TW,new E.e270(),C.mi,new E.e271(),C.zz,new E.e272(),C.z6,new E.e273(),C.kw,new E.e274(),C.zU,new E.e275(),C.RJ,new E.e276()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.bh,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.k5,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Wh,C.Mt,C.tU,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.BV,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.TU,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.Zj,C.Mt,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.hG,C.Vh,C.Mt,C.Zt,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.hG,C.Mt,C.l4,C.al,C.il],null,null)
-w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.h1,C.hf,C.n6],null,null),C.yS,P.EF([C.UX,C.X4],null,null),C.OG,C.CM,C.xE,P.EF([C.XA,C.CO],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.h9],null,null),C.bh,P.EF([C.PI,C.lg,C.Ms,C.Gl],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.h1,C.B0,C.Rf,C.r1,C.nP,C.mr,C.DC],null,null),C.KO,P.EF([C.yh,C.GE],null,null),C.wk,P.EF([C.AV,C.ti,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.h1,C.YT,C.V0,C.hf,C.n6,C.UY,C.rT],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.NA],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.VQ,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.Up,C.pO,C.au,C.Lc,C.Tt,C.AO,C.UE],null,null),C.iD,P.EF([C.QH,C.kt,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.dh,C.vb,C.eq,C.UL,C.mM],null,null),C.Wz,C.CM,C.k5,P.EF([C.fn,C.cV,C.XM,C.hL],null,null),C.qF,P.EF([C.vp,C.K9],null,null),C.nX,C.CM,C.Wh,P.EF([C.oj,C.dF],null,null),C.tU,P.EF([C.qs,C.ly],null,null),C.ce,P.EF([C.aH,C.hR,C.He,C.oV,C.vb,C.eq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bw,C.zz,C.lS],null,null),C.UJ,C.CM,C.BV,P.EF([C.bJ,C.iF,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.ZQ],null,null),C.j4,P.EF([C.rB,C.ZQ],null,null),C.TU,P.EF([C.rB,C.ZQ],null,null),C.CT,P.EF([C.rB,C.ZQ],null,null),C.mq,P.EF([C.rB,C.ZQ],null,null),C.Tq,P.EF([C.SR,C.HL,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.Ei],null,null),C.Ey,P.EF([C.XA,C.CO,C.uk,C.Mq],null,null),C.km,P.EF([C.rB,C.ZQ,C.bz,C.Bk,C.uk,C.Mq],null,null),C.vw,P.EF([C.uk,C.Mq,C.EV,C.Ei],null,null),C.Zj,P.EF([C.Ys,C.hK],null,null),C.ms,P.EF([C.cg,C.pU,C.uk,C.Mq,C.kV,C.Os],null,null),C.FA,P.EF([C.cg,C.pU,C.kV,C.Os],null,null),C.JW,P.EF([C.aP,C.xO,C.AV,C.h1,C.hf,C.n6],null,null),C.Mf,P.EF([C.uk,C.Mq],null,null),C.Dl,P.EF([C.j2,C.zJ,C.VK,C.m8],null,null),C.l4,C.CM,C.Vh,P.EF([C.j2,C.zJ],null,null),C.Zt,P.EF([C.WZ,C.Um,C.i0,C.GH,C.Gr,C.j3,C.SA,C.KI,C.tW,C.HM,C.CG,C.Ml,C.PX,C.Cj,C.N8,C.qE],null,null),C.Sb,P.EF([C.tW,C.HM,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.Cj,C.XY,C.ec,C.kz,C.db],null,null),C.wH,P.EF([C.yh,C.xQ],null,null),C.pK,P.EF([C.ne,C.l6],null,null),C.il,P.EF([C.uu,C.x3,C.xP,C.hI,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.No,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Nu,C.lH,C.A5,C.zU,C.IK],null,null),C.NR,P.EF([C.rE,C.Kv],null,null),C.vu,P.EF([C.kw,C.W9],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.yc,C.RJ,C.Ce],null,null)],null,null)
-v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.AV,"callback",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.kG,"classTable",C.OI,"classes",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.bJ,"counters",C.ox,"countersChanged",C.WZ,"coverage",C.i0,"coverageChanged",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.PI,"displayValue",C.aK,"doAction",C.GP,"element",C.Gr,"endPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.WQ,"field",C.Gd,"firstTokenPos",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.Uq,"getFormattedValue",C.A8,"getValue",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.ak,"hasParent",C.eo,"hashLink",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.wq,"hitStyle",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Ms,"iconClass",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.uu,"internal",C.qs,"io",C.h7,"ioEnabled",C.I9,"isBool",C.C1,"isComment",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.kA,"lastTokenPos",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.DY,"loading",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.So,"newHeapCapacity",C.EK,"newHeapUsed",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.eH,"oldHeapCapacity",C.ap,"oldHeapUsed",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.tW,"pos",C.CG,"posChanged",C.vb,"profile",C.UL,"profileChanged",C.QK,"qualified",C.AO,"qualifiedName",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.Gi,"relativeHashLink",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.XY,"showCoverage",C.kz,"showCoverageChanged",C.DW,"sortedRows",C.PM,"status",C.Nv,"subclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.hN,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.jh,"v",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName"],null,null),!1))
+E24:[function(){var z,y,x,w,v
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.WC,new E.wa(),C.S4,new E.Or(),C.Ro,new E.YL(),C.AV,new E.wf(),C.C0,new E.Oa(),C.eZ,new E.emv(),C.bk,new E.Lbd(),C.lH,new E.QAa(),C.kG,new E.CvS(),C.OI,new E.edy(),C.To,new E.waE(),C.XA,new E.Ore(),C.i4,new E.YLa(),C.qt,new E.wfa(),C.p1,new E.Oaa(),C.bJ,new E.e0(),C.ox,new E.e1(),C.WZ,new E.e2(),C.i0,new E.e3(),C.iE,new E.e4(),C.f4,new E.e5(),C.VK,new E.e6(),C.aH,new E.e7(),C.PI,new E.e8(),C.aK,new E.e9(),C.GP,new E.e10(),C.Gr,new E.e11(),C.tP,new E.e12(),C.yh,new E.e13(),C.Zb,new E.e14(),C.u7,new E.e15(),C.ne,new E.e16(),C.B0,new E.e17(),C.r1,new E.e18(),C.mr,new E.e19(),C.Ek,new E.e20(),C.Pn,new E.e21(),C.YT,new E.e22(),C.R3,new E.e23(),C.WQ,new E.e24(),C.jU,new E.e25(),C.Gd,new E.e26(),C.OO,new E.e27(),C.Mc,new E.e28(),C.FP,new E.e29(),C.kF,new E.e30(),C.UD,new E.e31(),C.Aq,new E.e32(),C.DS,new E.e33(),C.C9,new E.e34(),C.VF,new E.e35(),C.uU,new E.e36(),C.YJ,new E.e37(),C.eF,new E.e38(),C.oI,new E.e39(),C.ST,new E.e40(),C.QH,new E.e41(),C.qX,new E.e42(),C.rE,new E.e43(),C.nf,new E.e44(),C.pO,new E.e45(),C.EI,new E.e46(),C.JB,new E.e47(),C.Uq,new E.e48(),C.A8,new E.e49(),C.Ql,new E.e50(),C.SI,new E.e51(),C.zS,new E.e52(),C.ak,new E.e53(),C.eo,new E.e54(),C.Ge,new E.e55(),C.He,new E.e56(),C.wq,new E.e57(),C.k6,new E.e58(),C.oj,new E.e59(),C.PJ,new E.e60(),C.Ms,new E.e61(),C.q2,new E.e62(),C.d2,new E.e63(),C.kN,new E.e64(),C.fn,new E.e65(),C.eJ,new E.e66(),C.iG,new E.e67(),C.Py,new E.e68(),C.uu,new E.e69(),C.qs,new E.e70(),C.h7,new E.e71(),C.I9,new E.e72(),C.C1,new E.e73(),C.a0,new E.e74(),C.Yg,new E.e75(),C.bR,new E.e76(),C.ai,new E.e77(),C.ob,new E.e78(),C.Iv,new E.e79(),C.Wg,new E.e80(),C.tD,new E.e81(),C.nZ,new E.e82(),C.Of,new E.e83(),C.pY,new E.e84(),C.LA,new E.e85(),C.Lk,new E.e86(),C.dK,new E.e87(),C.xf,new E.e88(),C.rB,new E.e89(),C.bz,new E.e90(),C.Jx,new E.e91(),C.b5,new E.e92(),C.Lc,new E.e93(),C.hf,new E.e94(),C.uk,new E.e95(),C.kA,new E.e96(),C.Wn,new E.e97(),C.ur,new E.e98(),C.VN,new E.e99(),C.EV,new E.e100(),C.VI,new E.e101(),C.eh,new E.e102(),C.SA,new E.e103(),C.kV,new E.e104(),C.vp,new E.e105(),C.cc,new E.e106(),C.DY,new E.e107(),C.Lx,new E.e108(),C.M3,new E.e109(),C.wT,new E.e110(),C.SR,new E.e111(),C.t6,new E.e112(),C.rP,new E.e113(),C.pX,new E.e114(),C.VD,new E.e115(),C.NN,new E.e116(),C.UX,new E.e117(),C.YS,new E.e118(),C.pu,new E.e119(),C.So,new E.e120(),C.EK,new E.e121(),C.td,new E.e122(),C.Gn,new E.e123(),C.zO,new E.e124(),C.eH,new E.e125(),C.ap,new E.e126(),C.Ys,new E.e127(),C.zm,new E.e128(),C.XM,new E.e129(),C.Ic,new E.e130(),C.yG,new E.e131(),C.tW,new E.e132(),C.CG,new E.e133(),C.Wj,new E.e134(),C.vb,new E.e135(),C.UL,new E.e136(),C.AY,new E.e137(),C.QK,new E.e138(),C.AO,new E.e139(),C.I7,new E.e140(),C.xP,new E.e141(),C.Wm,new E.e142(),C.GR,new E.e143(),C.KX,new E.e144(),C.ja,new E.e145(),C.Dj,new E.e146(),C.Gi,new E.e147(),C.yL,new E.e148(),C.ni,new E.e149(),C.X2,new E.e150(),C.F3,new E.e151(),C.UY,new E.e152(),C.Aa,new E.e153(),C.nY,new E.e154(),C.HD,new E.e155(),C.iU,new E.e156(),C.eN,new E.e157(),C.ue,new E.e158(),C.nh,new E.e159(),C.L2,new E.e160(),C.Gs,new E.e161(),C.bE,new E.e162(),C.YD,new E.e163(),C.PX,new E.e164(),C.N8,new E.e165(),C.EA,new E.e166(),C.oW,new E.e167(),C.hd,new E.e168(),C.XY,new E.e169(),C.kz,new E.e170(),C.fV,new E.e171(),C.Ve,new E.e172(),C.jM,new E.e173(),C.DW,new E.e174(),C.PM,new E.e175(),C.Nv,new E.e176(),C.TW,new E.e177(),C.xS,new E.e178(),C.mi,new E.e179(),C.zz,new E.e180(),C.hO,new E.e181(),C.ei,new E.e182(),C.HK,new E.e183(),C.je,new E.e184(),C.hN,new E.e185(),C.Q1,new E.e186(),C.ID,new E.e187(),C.z6,new E.e188(),C.bc,new E.e189(),C.kw,new E.e190(),C.ep,new E.e191(),C.J2,new E.e192(),C.zU,new E.e193(),C.bn,new E.e194(),C.mh,new E.e195(),C.Fh,new E.e196(),C.jh,new E.e197(),C.fj,new E.e198(),C.xw,new E.e199(),C.zn,new E.e200(),C.RJ,new E.e201(),C.Tc,new E.e202(),C.YE,new E.e203(),C.Uy,new E.e204()],null,null)
+y=P.EF([C.aP,new E.e205(),C.cg,new E.e206(),C.j2,new E.e207(),C.S4,new E.e208(),C.AV,new E.e209(),C.bk,new E.e210(),C.lH,new E.e211(),C.kG,new E.e212(),C.XA,new E.e213(),C.i4,new E.e214(),C.bJ,new E.e215(),C.WZ,new E.e216(),C.VK,new E.e217(),C.aH,new E.e218(),C.PI,new E.e219(),C.Gr,new E.e220(),C.tP,new E.e221(),C.yh,new E.e222(),C.Zb,new E.e223(),C.ne,new E.e224(),C.B0,new E.e225(),C.mr,new E.e226(),C.YT,new E.e227(),C.WQ,new E.e228(),C.jU,new E.e229(),C.Gd,new E.e230(),C.OO,new E.e231(),C.Mc,new E.e232(),C.QH,new E.e233(),C.rE,new E.e234(),C.nf,new E.e235(),C.Ql,new E.e236(),C.ak,new E.e237(),C.eo,new E.e238(),C.Ge,new E.e239(),C.He,new E.e240(),C.oj,new E.e241(),C.Ms,new E.e242(),C.d2,new E.e243(),C.fn,new E.e244(),C.Py,new E.e245(),C.uu,new E.e246(),C.qs,new E.e247(),C.a0,new E.e248(),C.rB,new E.e249(),C.Lc,new E.e250(),C.hf,new E.e251(),C.uk,new E.e252(),C.kA,new E.e253(),C.ur,new E.e254(),C.EV,new E.e255(),C.eh,new E.e256(),C.SA,new E.e257(),C.kV,new E.e258(),C.vp,new E.e259(),C.SR,new E.e260(),C.t6,new E.e261(),C.UX,new E.e262(),C.YS,new E.e263(),C.td,new E.e264(),C.zO,new E.e265(),C.Ys,new E.e266(),C.XM,new E.e267(),C.Ic,new E.e268(),C.tW,new E.e269(),C.Wj,new E.e270(),C.vb,new E.e271(),C.QK,new E.e272(),C.AO,new E.e273(),C.xP,new E.e274(),C.GR,new E.e275(),C.KX,new E.e276(),C.ja,new E.e277(),C.Dj,new E.e278(),C.X2,new E.e279(),C.F3,new E.e280(),C.UY,new E.e281(),C.Aa,new E.e282(),C.nY,new E.e283(),C.HD,new E.e284(),C.iU,new E.e285(),C.eN,new E.e286(),C.Gs,new E.e287(),C.bE,new E.e288(),C.YD,new E.e289(),C.PX,new E.e290(),C.XY,new E.e291(),C.fV,new E.e292(),C.Ve,new E.e293(),C.jM,new E.e294(),C.PM,new E.e295(),C.Nv,new E.e296(),C.TW,new E.e297(),C.mi,new E.e298(),C.zz,new E.e299(),C.z6,new E.e300(),C.kw,new E.e301(),C.zU,new E.e302(),C.RJ,new E.e303(),C.YE,new E.e304()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.bh,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.BL,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.k5,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Wh,C.Mt,C.Ep,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.z7,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.TU,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.Zj,C.Mt,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.hG,C.Vh,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.hG,C.Mt,C.l4,C.al,C.il],null,null)
+w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.h1,C.hf,C.n6],null,null),C.yS,P.EF([C.UX,C.X4],null,null),C.OG,C.CM,C.xE,P.EF([C.XA,C.CO],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.h9],null,null),C.bh,P.EF([C.PI,C.lg,C.Ms,C.Gl],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.h1,C.B0,C.Rf,C.r1,C.nP,C.mr,C.DC],null,null),C.KO,P.EF([C.yh,C.GE],null,null),C.wk,P.EF([C.AV,C.ti,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.h1,C.YT,C.V0,C.hf,C.n6,C.UY,C.rT],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.NA],null,null),C.Vx,P.EF([C.OO,C.RM],null,null),C.BL,P.EF([C.Mc,C.XV],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.VQ,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.Up,C.pO,C.au,C.Lc,C.Tt,C.AO,C.UE],null,null),C.iD,P.EF([C.QH,C.kt,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.dh,C.vb,C.eq,C.UL,C.mM],null,null),C.Wz,C.CM,C.k5,P.EF([C.fn,C.cV,C.XM,C.hL],null,null),C.qF,P.EF([C.vp,C.K9],null,null),C.nX,C.CM,C.Wh,P.EF([C.oj,C.dF],null,null),C.Ep,P.EF([C.vp,C.K9],null,null),C.dD,P.EF([C.fV,C.CN],null,null),C.hP,P.EF([C.Wj,C.FN],null,null),C.tc,P.EF([C.vp,C.K9],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.v0],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.K9],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.Gg],null,null),C.tU,P.EF([C.qs,C.ly],null,null),C.DD,P.EF([C.vp,C.K9],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Xt],null,null),C.ce,P.EF([C.aH,C.hR,C.He,C.oV,C.vb,C.eq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bw,C.zz,C.lS],null,null),C.UJ,C.CM,C.z7,P.EF([C.bJ,C.iF,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.ZQ],null,null),C.j4,P.EF([C.rB,C.ZQ],null,null),C.TU,P.EF([C.rB,C.ZQ],null,null),C.CT,P.EF([C.rB,C.ZQ],null,null),C.mq,P.EF([C.rB,C.ZQ],null,null),C.Tq,P.EF([C.SR,C.HL,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.Ei],null,null),C.Ey,P.EF([C.XA,C.CO,C.uk,C.Mq],null,null),C.km,P.EF([C.rB,C.ZQ,C.bz,C.Bk,C.uk,C.Mq],null,null),C.vw,P.EF([C.uk,C.Mq,C.EV,C.Ei],null,null),C.Zj,P.EF([C.Ys,C.hK],null,null),C.ms,P.EF([C.cg,C.pU,C.uk,C.Mq,C.kV,C.Os],null,null),C.FA,P.EF([C.cg,C.pU,C.kV,C.Os],null,null),C.JW,P.EF([C.aP,C.xO,C.AV,C.h1,C.hf,C.n6],null,null),C.Mf,P.EF([C.uk,C.Mq],null,null),C.Dl,P.EF([C.j2,C.zJ,C.VK,C.m8],null,null),C.l4,C.CM,C.Vh,P.EF([C.j2,C.zJ],null,null),C.ON,P.EF([C.WZ,C.Um,C.i0,C.GH,C.Gr,C.j3,C.SA,C.KI,C.tW,C.HM,C.CG,C.Ml,C.PX,C.Cj,C.N8,C.qE],null,null),C.Sb,P.EF([C.tW,C.HM,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.Cj,C.XY,C.ec,C.kz,C.db],null,null),C.wH,P.EF([C.yh,C.xQ],null,null),C.pK,P.EF([C.ne,C.l6],null,null),C.il,P.EF([C.uu,C.x3,C.xP,C.hI,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.No,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Nu,C.lH,C.A5,C.zU,C.IK],null,null),C.NR,P.EF([C.rE,C.Kv],null,null),C.vu,P.EF([C.kw,C.W9],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.yc,C.RJ,C.Ce],null,null)],null,null)
+v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.AV,"callback",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.kG,"classTable",C.OI,"classes",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.bJ,"counters",C.ox,"countersChanged",C.WZ,"coverage",C.i0,"coverageChanged",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.PI,"displayValue",C.aK,"doAction",C.GP,"element",C.Gr,"endPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.R3,"fd",C.WQ,"field",C.jU,"file",C.Gd,"firstTokenPos",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.Uq,"getFormattedValue",C.A8,"getValue",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.ak,"hasParent",C.eo,"hashLink",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.wq,"hitStyle",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Ms,"iconClass",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.uu,"internal",C.qs,"io",C.h7,"ioEnabled",C.I9,"isBool",C.C1,"isComment",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.LA,"isPipe",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.kA,"lastTokenPos",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.So,"newHeapCapacity",C.EK,"newHeapUsed",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.eH,"oldHeapCapacity",C.ap,"oldHeapUsed",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.Gi,"relativeHashLink",C.yL,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.XY,"showCoverage",C.kz,"showCoverageChanged",C.fV,"small",C.Ve,"socket",C.jM,"socketOwner",C.DW,"sortedRows",C.PM,"status",C.Nv,"subclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.hN,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
 $.j8=new O.LT(z,y,C.CM)
 $.Yv=new O.bY(x,w,!1)
 $.qe=v
-A.X1([new E.e277(),new E.e278(),new E.e279(),new E.e280(),new E.e281(),new E.e282(),new E.e283(),new E.e284(),new E.e285(),new E.e286(),new E.e287(),new E.e288(),new E.e289(),new E.e290(),new E.e291(),new E.e292(),new E.e293(),new E.e294(),new E.e295(),new E.e296(),new E.e297(),new E.e298(),new E.e299(),new E.e300(),new E.e301(),new E.e302(),new E.e303(),new E.e304(),new E.e305(),new E.e306(),new E.e307(),new E.e308(),new E.e309(),new E.e310(),new E.e311(),new E.e312(),new E.e313(),new E.e314(),new E.e315(),new E.e316(),new E.e317(),new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333()],!0)},"$0","Tb",0,0,13],
+$.M6=[new E.e305(),new E.e306(),new E.e307(),new E.e308(),new E.e309(),new E.e310(),new E.e311(),new E.e312(),new E.e313(),new E.e314(),new E.e315(),new E.e316(),new E.e317(),new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333(),new E.e334(),new E.e335(),new E.e336(),new E.e337(),new E.e338(),new E.e339(),new E.e340(),new E.e341(),new E.e342(),new E.e343(),new E.e344(),new E.e345(),new E.e346(),new E.e347(),new E.e348(),new E.e349(),new E.e350(),new E.e351(),new E.e352(),new E.e353(),new E.e354(),new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376()]
+$.UG=!0
+F.E2()},"$0","vS",0,0,15],
 em:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.Jp(a)},
 $isEH:true},
 Lb:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return a.gYu()},
 $isEH:true},
 QA:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.Ln(a)},
 $isEH:true},
 Cv:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.un(a)},
 $isEH:true},
 ed:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return a.gA3()},
 $isEH:true},
 wa:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return a.gqr()},
 $isEH:true},
 Or:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.nG(a)},
 $isEH:true},
 YL:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.aA(a)},
 $isEH:true},
 wf:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.WT(a)},
 $isEH:true},
 Oa:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.Wp(a)},
 $isEH:true},
 emv:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.n9(a)},
 $isEH:true},
 Lbd:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.K0(a)},
 $isEH:true},
 QAa:{
-"^":"Xs:30;",
-$1:function(a){return J.PP(a)},
+"^":"Tp:10;",
+$1:function(a){return J.hn(a)},
 $isEH:true},
 CvS:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.yz(a)},
 $isEH:true},
 edy:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.pP(a)},
 $isEH:true},
 waE:{
-"^":"Xs:30;",
-$1:function(a){return J.E3(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gaP()},
 $isEH:true},
 Ore:{
-"^":"Xs:30;",
-$1:function(a){return J.on(a)},
+"^":"Tp:10;",
+$1:function(a){return J.E3(a)},
 $isEH:true},
 YLa:{
-"^":"Xs:30;",
-$1:function(a){return J.SM(a)},
+"^":"Tp:10;",
+$1:function(a){return J.on(a)},
 $isEH:true},
 wfa:{
-"^":"Xs:30;",
-$1:function(a){return a.goH()},
+"^":"Tp:10;",
+$1:function(a){return J.SM(a)},
 $isEH:true},
 Oaa:{
-"^":"Xs:30;",
-$1:function(a){return J.zD(a)},
+"^":"Tp:10;",
+$1:function(a){return a.goH()},
 $isEH:true},
 e0:{
-"^":"Xs:30;",
-$1:function(a){return J.jd(a)},
+"^":"Tp:10;",
+$1:function(a){return J.OT(a)},
 $isEH:true},
 e1:{
-"^":"Xs:30;",
-$1:function(a){return J.dy(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Ok(a)},
 $isEH:true},
 e2:{
-"^":"Xs:30;",
-$1:function(a){return J.RC(a)},
+"^":"Tp:10;",
+$1:function(a){return J.wd(a)},
 $isEH:true},
 e3:{
-"^":"Xs:30;",
-$1:function(a){return a.gSL()},
+"^":"Tp:10;",
+$1:function(a){return J.RC(a)},
 $isEH:true},
 e4:{
-"^":"Xs:30;",
-$1:function(a){return a.guH()},
+"^":"Tp:10;",
+$1:function(a){return a.gSL()},
 $isEH:true},
 e5:{
-"^":"Xs:30;",
-$1:function(a){return J.mP(a)},
+"^":"Tp:10;",
+$1:function(a){return a.guH()},
 $isEH:true},
 e6:{
-"^":"Xs:30;",
-$1:function(a){return J.BT(a)},
+"^":"Tp:10;",
+$1:function(a){return J.mP(a)},
 $isEH:true},
 e7:{
-"^":"Xs:30;",
-$1:function(a){return J.yA(a)},
+"^":"Tp:10;",
+$1:function(a){return J.BT(a)},
 $isEH:true},
 e8:{
-"^":"Xs:30;",
-$1:function(a){return J.vi(a)},
+"^":"Tp:10;",
+$1:function(a){return J.yA(a)},
 $isEH:true},
 e9:{
-"^":"Xs:30;",
-$1:function(a){return a.gFL()},
+"^":"Tp:10;",
+$1:function(a){return J.vi(a)},
 $isEH:true},
 e10:{
-"^":"Xs:30;",
-$1:function(a){return J.rw(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gFL()},
 $isEH:true},
 e11:{
-"^":"Xs:30;",
-$1:function(a){return a.gw2()},
+"^":"Tp:10;",
+$1:function(a){return J.rw(a)},
 $isEH:true},
 e12:{
-"^":"Xs:30;",
-$1:function(a){return J.w8(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gw2()},
 $isEH:true},
 e13:{
-"^":"Xs:30;",
-$1:function(a){return J.ht(a)},
+"^":"Tp:10;",
+$1:function(a){return J.w8(a)},
 $isEH:true},
 e14:{
-"^":"Xs:30;",
-$1:function(a){return J.yi(a)},
-$isEH:true},
-e15:{
-"^":"Xs:30;",
-$1:function(a){return J.Vl(a)},
-$isEH:true},
-e16:{
-"^":"Xs:30;",
-$1:function(a){return J.kE(a)},
-$isEH:true},
-e17:{
-"^":"Xs:30;",
-$1:function(a){return J.Ak(a)},
-$isEH:true},
-e18:{
-"^":"Xs:30;",
-$1:function(a){return J.Mz(a)},
-$isEH:true},
-e19:{
-"^":"Xs:30;",
-$1:function(a){return J.S9(a)},
-$isEH:true},
-e20:{
-"^":"Xs:30;",
-$1:function(a){return a.gty()},
-$isEH:true},
-e21:{
-"^":"Xs:30;",
-$1:function(a){return J.yn(a)},
-$isEH:true},
-e22:{
-"^":"Xs:30;",
-$1:function(a){return J.pm(a)},
-$isEH:true},
-e23:{
-"^":"Xs:30;",
-$1:function(a){return a.ghY()},
-$isEH:true},
-e24:{
-"^":"Xs:30;",
-$1:function(a){return J.WX(a)},
-$isEH:true},
-e25:{
-"^":"Xs:30;",
-$1:function(a){return J.Qv(a)},
-$isEH:true},
-e26:{
-"^":"Xs:30;",
-$1:function(a){return a.gZd()},
-$isEH:true},
-e27:{
-"^":"Xs:30;",
-$1:function(a){return J.lT(a)},
-$isEH:true},
-e28:{
-"^":"Xs:30;",
-$1:function(a){return J.M4(a)},
-$isEH:true},
-e29:{
-"^":"Xs:30;",
-$1:function(a){return a.gkA()},
-$isEH:true},
-e30:{
-"^":"Xs:30;",
-$1:function(a){return a.gGK()},
-$isEH:true},
-e31:{
-"^":"Xs:30;",
-$1:function(a){return a.gan()},
-$isEH:true},
-e32:{
-"^":"Xs:30;",
-$1:function(a){return a.gcQ()},
-$isEH:true},
-e33:{
-"^":"Xs:30;",
-$1:function(a){return a.gS7()},
-$isEH:true},
-e34:{
-"^":"Xs:30;",
-$1:function(a){return a.gP3()},
-$isEH:true},
-e35:{
-"^":"Xs:30;",
-$1:function(a){return J.PY(a)},
-$isEH:true},
-e36:{
-"^":"Xs:30;",
-$1:function(a){return J.bu(a)},
-$isEH:true},
-e37:{
-"^":"Xs:30;",
-$1:function(a){return J.VL(a)},
-$isEH:true},
-e38:{
-"^":"Xs:30;",
-$1:function(a){return J.zN(a)},
-$isEH:true},
-e39:{
-"^":"Xs:30;",
-$1:function(a){return J.FI(a)},
-$isEH:true},
-e40:{
-"^":"Xs:30;",
-$1:function(a){return J.WY(a)},
-$isEH:true},
-e41:{
-"^":"Xs:30;",
-$1:function(a){return a.gmu()},
-$isEH:true},
-e42:{
-"^":"Xs:30;",
-$1:function(a){return a.gCO()},
-$isEH:true},
-e43:{
-"^":"Xs:30;",
-$1:function(a){return a.gwy()},
-$isEH:true},
-e44:{
-"^":"Xs:30;",
-$1:function(a){return a.gyY()},
-$isEH:true},
-e45:{
-"^":"Xs:30;",
-$1:function(a){return J.wO(a)},
-$isEH:true},
-e46:{
-"^":"Xs:30;",
-$1:function(a){return a.gGf()},
-$isEH:true},
-e47:{
-"^":"Xs:30;",
-$1:function(a){return a.gUa()},
-$isEH:true},
-e48:{
-"^":"Xs:30;",
-$1:function(a){return J.Mb(a)},
-$isEH:true},
-e49:{
-"^":"Xs:30;",
-$1:function(a){return a.gHP()},
-$isEH:true},
-e50:{
-"^":"Xs:30;",
-$1:function(a){return J.z3(a)},
-$isEH:true},
-e51:{
-"^":"Xs:30;",
-$1:function(a){return J.YQ(a)},
-$isEH:true},
-e52:{
-"^":"Xs:30;",
-$1:function(a){return J.B9(a)},
-$isEH:true},
-e53:{
-"^":"Xs:30;",
-$1:function(a){return J.fA(a)},
-$isEH:true},
-e54:{
-"^":"Xs:30;",
-$1:function(a){return J.cd(a)},
-$isEH:true},
-e55:{
-"^":"Xs:30;",
-$1:function(a){return a.gL4()},
-$isEH:true},
-e56:{
-"^":"Xs:30;",
-$1:function(a){return J.pB(a)},
-$isEH:true},
-e57:{
-"^":"Xs:30;",
-$1:function(a){return a.gaj()},
-$isEH:true},
-e58:{
-"^":"Xs:30;",
-$1:function(a){return a.giq()},
-$isEH:true},
-e59:{
-"^":"Xs:30;",
-$1:function(a){return a.gBm()},
-$isEH:true},
-e60:{
-"^":"Xs:30;",
-$1:function(a){return J.xR(a)},
-$isEH:true},
-e61:{
-"^":"Xs:30;",
-$1:function(a){return a.gNI()},
-$isEH:true},
-e62:{
-"^":"Xs:30;",
-$1:function(a){return a.gva()},
-$isEH:true},
-e63:{
-"^":"Xs:30;",
-$1:function(a){return a.gKt()},
-$isEH:true},
-e64:{
-"^":"Xs:30;",
-$1:function(a){return J.ns(a)},
-$isEH:true},
-e65:{
-"^":"Xs:30;",
-$1:function(a){return J.Ew(a)},
-$isEH:true},
-e66:{
-"^":"Xs:30;",
-$1:function(a){return a.gwg()},
-$isEH:true},
-e67:{
-"^":"Xs:30;",
-$1:function(a){return J.Ja(a)},
-$isEH:true},
-e68:{
-"^":"Xs:30;",
-$1:function(a){return a.gUB()},
-$isEH:true},
-e69:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.is(a)},
 $isEH:true},
+e15:{
+"^":"Tp:10;",
+$1:function(a){return J.yi(a)},
+$isEH:true},
+e16:{
+"^":"Tp:10;",
+$1:function(a){return J.Vl(a)},
+$isEH:true},
+e17:{
+"^":"Tp:10;",
+$1:function(a){return J.kE(a)},
+$isEH:true},
+e18:{
+"^":"Tp:10;",
+$1:function(a){return J.Ak(a)},
+$isEH:true},
+e19:{
+"^":"Tp:10;",
+$1:function(a){return J.Mz(a)},
+$isEH:true},
+e20:{
+"^":"Tp:10;",
+$1:function(a){return J.S9(a)},
+$isEH:true},
+e21:{
+"^":"Tp:10;",
+$1:function(a){return a.gty()},
+$isEH:true},
+e22:{
+"^":"Tp:10;",
+$1:function(a){return J.yn(a)},
+$isEH:true},
+e23:{
+"^":"Tp:10;",
+$1:function(a){return a.gkE()},
+$isEH:true},
+e24:{
+"^":"Tp:10;",
+$1:function(a){return J.pm(a)},
+$isEH:true},
+e25:{
+"^":"Tp:10;",
+$1:function(a){return J.WA(a)},
+$isEH:true},
+e26:{
+"^":"Tp:10;",
+$1:function(a){return a.ghY()},
+$isEH:true},
+e27:{
+"^":"Tp:10;",
+$1:function(a){return J.ra(a)},
+$isEH:true},
+e28:{
+"^":"Tp:10;",
+$1:function(a){return J.QZ(a)},
+$isEH:true},
+e29:{
+"^":"Tp:10;",
+$1:function(a){return J.WX(a)},
+$isEH:true},
+e30:{
+"^":"Tp:10;",
+$1:function(a){return J.JD(a)},
+$isEH:true},
+e31:{
+"^":"Tp:10;",
+$1:function(a){return a.gZd()},
+$isEH:true},
+e32:{
+"^":"Tp:10;",
+$1:function(a){return J.lT(a)},
+$isEH:true},
+e33:{
+"^":"Tp:10;",
+$1:function(a){return J.M4(a)},
+$isEH:true},
+e34:{
+"^":"Tp:10;",
+$1:function(a){return a.gkA()},
+$isEH:true},
+e35:{
+"^":"Tp:10;",
+$1:function(a){return a.gGK()},
+$isEH:true},
+e36:{
+"^":"Tp:10;",
+$1:function(a){return a.gan()},
+$isEH:true},
+e37:{
+"^":"Tp:10;",
+$1:function(a){return a.gcQ()},
+$isEH:true},
+e38:{
+"^":"Tp:10;",
+$1:function(a){return a.gS7()},
+$isEH:true},
+e39:{
+"^":"Tp:10;",
+$1:function(a){return a.gP3()},
+$isEH:true},
+e40:{
+"^":"Tp:10;",
+$1:function(a){return J.PY(a)},
+$isEH:true},
+e41:{
+"^":"Tp:10;",
+$1:function(a){return J.bu(a)},
+$isEH:true},
+e42:{
+"^":"Tp:10;",
+$1:function(a){return J.VL(a)},
+$isEH:true},
+e43:{
+"^":"Tp:10;",
+$1:function(a){return J.zN(a)},
+$isEH:true},
+e44:{
+"^":"Tp:10;",
+$1:function(a){return J.m4(a)},
+$isEH:true},
+e45:{
+"^":"Tp:10;",
+$1:function(a){return J.WY(a)},
+$isEH:true},
+e46:{
+"^":"Tp:10;",
+$1:function(a){return a.gmu()},
+$isEH:true},
+e47:{
+"^":"Tp:10;",
+$1:function(a){return a.gCO()},
+$isEH:true},
+e48:{
+"^":"Tp:10;",
+$1:function(a){return a.gwy()},
+$isEH:true},
+e49:{
+"^":"Tp:10;",
+$1:function(a){return a.gyY()},
+$isEH:true},
+e50:{
+"^":"Tp:10;",
+$1:function(a){return J.wO(a)},
+$isEH:true},
+e51:{
+"^":"Tp:10;",
+$1:function(a){return a.gGf()},
+$isEH:true},
+e52:{
+"^":"Tp:10;",
+$1:function(a){return a.gUa()},
+$isEH:true},
+e53:{
+"^":"Tp:10;",
+$1:function(a){return J.u1(a)},
+$isEH:true},
+e54:{
+"^":"Tp:10;",
+$1:function(a){return a.gHP()},
+$isEH:true},
+e55:{
+"^":"Tp:10;",
+$1:function(a){return J.z3(a)},
+$isEH:true},
+e56:{
+"^":"Tp:10;",
+$1:function(a){return J.YQ(a)},
+$isEH:true},
+e57:{
+"^":"Tp:10;",
+$1:function(a){return J.Hr(a)},
+$isEH:true},
+e58:{
+"^":"Tp:10;",
+$1:function(a){return J.fA(a)},
+$isEH:true},
+e59:{
+"^":"Tp:10;",
+$1:function(a){return J.cd(a)},
+$isEH:true},
+e60:{
+"^":"Tp:10;",
+$1:function(a){return a.gL4()},
+$isEH:true},
+e61:{
+"^":"Tp:10;",
+$1:function(a){return J.pB(a)},
+$isEH:true},
+e62:{
+"^":"Tp:10;",
+$1:function(a){return a.gaj()},
+$isEH:true},
+e63:{
+"^":"Tp:10;",
+$1:function(a){return a.giq()},
+$isEH:true},
+e64:{
+"^":"Tp:10;",
+$1:function(a){return a.gBm()},
+$isEH:true},
+e65:{
+"^":"Tp:10;",
+$1:function(a){return J.xR(a)},
+$isEH:true},
+e66:{
+"^":"Tp:10;",
+$1:function(a){return a.gNI()},
+$isEH:true},
+e67:{
+"^":"Tp:10;",
+$1:function(a){return a.gva()},
+$isEH:true},
+e68:{
+"^":"Tp:10;",
+$1:function(a){return a.gKt()},
+$isEH:true},
+e69:{
+"^":"Tp:10;",
+$1:function(a){return J.ns(a)},
+$isEH:true},
 e70:{
-"^":"Xs:30;",
-$1:function(a){return a.gkU()},
+"^":"Tp:10;",
+$1:function(a){return J.Ew(a)},
 $isEH:true},
 e71:{
-"^":"Xs:30;",
-$1:function(a){return J.wz(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gwg()},
 $isEH:true},
 e72:{
-"^":"Xs:30;",
-$1:function(a){return J.FN(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Ja(a)},
 $isEH:true},
 e73:{
-"^":"Xs:30;",
-$1:function(a){return J.ls(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gUB()},
 $isEH:true},
 e74:{
-"^":"Xs:30;",
-$1:function(a){return J.yq(a)},
+"^":"Tp:10;",
+$1:function(a){return J.pd(a)},
 $isEH:true},
 e75:{
-"^":"Xs:30;",
-$1:function(a){return J.SZ(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gkU()},
 $isEH:true},
 e76:{
-"^":"Xs:30;",
-$1:function(a){return J.DL(a)},
+"^":"Tp:10;",
+$1:function(a){return J.wz(a)},
 $isEH:true},
 e77:{
-"^":"Xs:30;",
-$1:function(a){return J.z4(a)},
+"^":"Tp:10;",
+$1:function(a){return J.tx(a)},
 $isEH:true},
 e78:{
-"^":"Xs:30;",
-$1:function(a){return J.cU(a)},
+"^":"Tp:10;",
+$1:function(a){return J.ls(a)},
 $isEH:true},
 e79:{
-"^":"Xs:30;",
-$1:function(a){return a.gYG()},
+"^":"Tp:10;",
+$1:function(a){return J.yq(a)},
 $isEH:true},
 e80:{
-"^":"Xs:30;",
-$1:function(a){return J.UM(a)},
+"^":"Tp:10;",
+$1:function(a){return J.SZ(a)},
 $isEH:true},
 e81:{
-"^":"Xs:30;",
-$1:function(a){return J.ZN(a)},
+"^":"Tp:10;",
+$1:function(a){return J.DL(a)},
 $isEH:true},
 e82:{
-"^":"Xs:30;",
-$1:function(a){return J.xa(a)},
+"^":"Tp:10;",
+$1:function(a){return J.yx(a)},
 $isEH:true},
 e83:{
-"^":"Xs:30;",
-$1:function(a){return J.aT(a)},
+"^":"Tp:10;",
+$1:function(a){return J.cU(a)},
 $isEH:true},
 e84:{
-"^":"Xs:30;",
-$1:function(a){return J.hb(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gYG()},
 $isEH:true},
 e85:{
-"^":"Xs:30;",
-$1:function(a){return a.gi2()},
+"^":"Tp:10;",
+$1:function(a){return a.gHY()},
 $isEH:true},
 e86:{
-"^":"Xs:30;",
-$1:function(a){return a.gEB()},
+"^":"Tp:10;",
+$1:function(a){return J.UM(a)},
 $isEH:true},
 e87:{
-"^":"Xs:30;",
-$1:function(a){return J.Iz(a)},
+"^":"Tp:10;",
+$1:function(a){return J.ZN(a)},
 $isEH:true},
 e88:{
-"^":"Xs:30;",
-$1:function(a){return J.Q4(a)},
+"^":"Tp:10;",
+$1:function(a){return J.xa(a)},
 $isEH:true},
 e89:{
-"^":"Xs:30;",
-$1:function(a){return J.MQ(a)},
+"^":"Tp:10;",
+$1:function(a){return J.aT(a)},
 $isEH:true},
 e90:{
-"^":"Xs:30;",
-$1:function(a){return a.gSK()},
+"^":"Tp:10;",
+$1:function(a){return J.hb(a)},
 $isEH:true},
 e91:{
-"^":"Xs:30;",
-$1:function(a){return J.q8(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gi2()},
 $isEH:true},
 e92:{
-"^":"Xs:30;",
-$1:function(a){return a.ghX()},
+"^":"Tp:10;",
+$1:function(a){return a.gEB()},
 $isEH:true},
 e93:{
-"^":"Xs:30;",
-$1:function(a){return a.gvU()},
+"^":"Tp:10;",
+$1:function(a){return J.Iz(a)},
 $isEH:true},
 e94:{
-"^":"Xs:30;",
-$1:function(a){return J.jl(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Q4(a)},
 $isEH:true},
 e95:{
-"^":"Xs:30;",
-$1:function(a){return a.gRd()},
+"^":"Tp:10;",
+$1:function(a){return J.MQ(a)},
 $isEH:true},
 e96:{
-"^":"Xs:30;",
-$1:function(a){return J.zY(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gSK()},
 $isEH:true},
 e97:{
-"^":"Xs:30;",
-$1:function(a){return J.de(a)},
+"^":"Tp:10;",
+$1:function(a){return J.q8(a)},
 $isEH:true},
 e98:{
-"^":"Xs:30;",
-$1:function(a){return J.Ds(a)},
+"^":"Tp:10;",
+$1:function(a){return a.ghX()},
 $isEH:true},
 e99:{
-"^":"Xs:30;",
-$1:function(a){return J.cO(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gvU()},
 $isEH:true},
 e100:{
-"^":"Xs:30;",
-$1:function(a){return a.gn0()},
+"^":"Tp:10;",
+$1:function(a){return J.jl(a)},
 $isEH:true},
 e101:{
-"^":"Xs:30;",
-$1:function(a){return a.geH()},
+"^":"Tp:10;",
+$1:function(a){return a.gRd()},
 $isEH:true},
 e102:{
-"^":"Xs:30;",
-$1:function(a){return J.Yf(a)},
+"^":"Tp:10;",
+$1:function(a){return J.zY(a)},
 $isEH:true},
 e103:{
-"^":"Xs:30;",
-$1:function(a){return J.kv(a)},
+"^":"Tp:10;",
+$1:function(a){return J.de(a)},
 $isEH:true},
 e104:{
-"^":"Xs:30;",
-$1:function(a){return J.QD(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Ds(a)},
 $isEH:true},
 e105:{
-"^":"Xs:30;",
-$1:function(a){return J.z2(a)},
+"^":"Tp:10;",
+$1:function(a){return J.cO(a)},
 $isEH:true},
 e106:{
-"^":"Xs:30;",
-$1:function(a){return J.ZL(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gzM()},
 $isEH:true},
 e107:{
-"^":"Xs:30;",
-$1:function(a){return J.ba(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gn0()},
 $isEH:true},
 e108:{
-"^":"Xs:30;",
-$1:function(a){return J.Zv(a)},
+"^":"Tp:10;",
+$1:function(a){return a.giP()},
 $isEH:true},
 e109:{
-"^":"Xs:30;",
-$1:function(a){return J.tE(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gLw()},
 $isEH:true},
 e110:{
-"^":"Xs:30;",
-$1:function(a){return J.yK(a)},
+"^":"Tp:10;",
+$1:function(a){return a.geH()},
 $isEH:true},
 e111:{
-"^":"Xs:30;",
-$1:function(a){return a.gxs()},
+"^":"Tp:10;",
+$1:function(a){return J.Yf(a)},
 $isEH:true},
 e112:{
-"^":"Xs:30;",
-$1:function(a){return a.gCi()},
+"^":"Tp:10;",
+$1:function(a){return J.kv(a)},
 $isEH:true},
 e113:{
-"^":"Xs:30;",
-$1:function(a){return J.Jj(a)},
+"^":"Tp:10;",
+$1:function(a){return J.ih(a)},
 $isEH:true},
 e114:{
-"^":"Xs:30;",
-$1:function(a){return J.t8(a)},
+"^":"Tp:10;",
+$1:function(a){return J.z2(a)},
 $isEH:true},
 e115:{
-"^":"Xs:30;",
-$1:function(a){return a.gL1()},
+"^":"Tp:10;",
+$1:function(a){return J.ZL(a)},
 $isEH:true},
 e116:{
-"^":"Xs:30;",
-$1:function(a){return a.gQB()},
+"^":"Tp:10;",
+$1:function(a){return J.ba(a)},
 $isEH:true},
 e117:{
-"^":"Xs:30;",
-$1:function(a){return a.guq()},
+"^":"Tp:10;",
+$1:function(a){return J.Zv(a)},
 $isEH:true},
 e118:{
-"^":"Xs:30;",
-$1:function(a){return J.EC(a)},
+"^":"Tp:10;",
+$1:function(a){return J.O6(a)},
 $isEH:true},
 e119:{
-"^":"Xs:30;",
-$1:function(a){return J.JG(a)},
+"^":"Tp:10;",
+$1:function(a){return J.HO(a)},
 $isEH:true},
 e120:{
-"^":"Xs:30;",
-$1:function(a){return J.AF(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gxs()},
 $isEH:true},
 e121:{
-"^":"Xs:30;",
-$1:function(a){return J.LB(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gCi()},
 $isEH:true},
 e122:{
-"^":"Xs:30;",
-$1:function(a){return J.Kl(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Jj(a)},
 $isEH:true},
 e123:{
-"^":"Xs:30;",
-$1:function(a){return J.io(a)},
+"^":"Tp:10;",
+$1:function(a){return J.t8(a)},
 $isEH:true},
 e124:{
-"^":"Xs:30;",
-$1:function(a){return J.Ff(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gL1()},
 $isEH:true},
 e125:{
-"^":"Xs:30;",
-$1:function(a){return J.ks(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gQB()},
 $isEH:true},
 e126:{
-"^":"Xs:30;",
-$1:function(a){return J.CN(a)},
+"^":"Tp:10;",
+$1:function(a){return a.guq()},
 $isEH:true},
 e127:{
-"^":"Xs:30;",
-$1:function(a){return J.Pr(a)},
+"^":"Tp:10;",
+$1:function(a){return J.EC(a)},
 $isEH:true},
 e128:{
-"^":"Xs:30;",
-$1:function(a){return J.Sz(a)},
+"^":"Tp:10;",
+$1:function(a){return J.JG(a)},
 $isEH:true},
 e129:{
-"^":"Xs:30;",
-$1:function(a){return J.Gc(a)},
+"^":"Tp:10;",
+$1:function(a){return J.AF(a)},
 $isEH:true},
 e130:{
-"^":"Xs:30;",
-$1:function(a){return J.Dd(a)},
+"^":"Tp:10;",
+$1:function(a){return J.LB(a)},
 $isEH:true},
 e131:{
-"^":"Xs:30;",
-$1:function(a){return J.Cm(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Kl(a)},
 $isEH:true},
 e132:{
-"^":"Xs:30;",
-$1:function(a){return J.AK(a)},
+"^":"Tp:10;",
+$1:function(a){return J.io(a)},
 $isEH:true},
 e133:{
-"^":"Xs:30;",
-$1:function(a){return J.tF(a)},
+"^":"Tp:10;",
+$1:function(a){return J.fy(a)},
 $isEH:true},
 e134:{
-"^":"Xs:30;",
-$1:function(a){return J.QX(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Qa(a)},
 $isEH:true},
 e135:{
-"^":"Xs:30;",
-$1:function(a){return a.gw6()},
+"^":"Tp:10;",
+$1:function(a){return J.ks(a)},
 $isEH:true},
 e136:{
-"^":"Xs:30;",
-$1:function(a){return J.iL(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Hf(a)},
 $isEH:true},
 e137:{
-"^":"Xs:30;",
-$1:function(a){return J.k7(a)},
+"^":"Tp:10;",
+$1:function(a){return J.WM(a)},
 $isEH:true},
 e138:{
-"^":"Xs:30;",
-$1:function(a){return J.uW(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Pr(a)},
 $isEH:true},
 e139:{
-"^":"Xs:30;",
-$1:function(a){return J.W2(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Sz(a)},
 $isEH:true},
 e140:{
-"^":"Xs:30;",
-$1:function(a){return J.UT(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gm8()},
 $isEH:true},
 e141:{
-"^":"Xs:30;",
-$1:function(a){return J.jH(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Gc(a)},
 $isEH:true},
 e142:{
-"^":"Xs:30;",
-$1:function(a){return J.jo(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Dd(a)},
 $isEH:true},
 e143:{
-"^":"Xs:30;",
-$1:function(a){return a.gVc()},
+"^":"Tp:10;",
+$1:function(a){return J.Cm(a)},
 $isEH:true},
 e144:{
-"^":"Xs:30;",
-$1:function(a){return a.gpF()},
+"^":"Tp:10;",
+$1:function(a){return J.AK(a)},
 $isEH:true},
 e145:{
-"^":"Xs:30;",
-$1:function(a){return J.oL(a)},
+"^":"Tp:10;",
+$1:function(a){return J.tF(a)},
 $isEH:true},
 e146:{
-"^":"Xs:30;",
-$1:function(a){return a.gA6()},
+"^":"Tp:10;",
+$1:function(a){return J.QX(a)},
 $isEH:true},
 e147:{
-"^":"Xs:30;",
-$1:function(a){return J.Ry(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gw6()},
 $isEH:true},
 e148:{
-"^":"Xs:30;",
-$1:function(a){return J.UP(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gNS()},
 $isEH:true},
 e149:{
-"^":"Xs:30;",
-$1:function(a){return J.fw(a)},
+"^":"Tp:10;",
+$1:function(a){return a.guh()},
 $isEH:true},
 e150:{
-"^":"Xs:30;",
-$1:function(a){return J.fx(a)},
+"^":"Tp:10;",
+$1:function(a){return J.iL(a)},
 $isEH:true},
 e151:{
-"^":"Xs:30;",
-$1:function(a){return J.Vi(a)},
+"^":"Tp:10;",
+$1:function(a){return J.jP(a)},
 $isEH:true},
 e152:{
-"^":"Xs:30;",
-$1:function(a){return a.ghp()},
+"^":"Tp:10;",
+$1:function(a){return J.uW(a)},
 $isEH:true},
 e153:{
-"^":"Xs:30;",
-$1:function(a){return J.P5(a)},
+"^":"Tp:10;",
+$1:function(a){return J.W2(a)},
 $isEH:true},
 e154:{
-"^":"Xs:30;",
-$1:function(a){return a.gzS()},
+"^":"Tp:10;",
+$1:function(a){return J.UT(a)},
 $isEH:true},
 e155:{
-"^":"Xs:30;",
-$1:function(a){return J.iY(a)},
+"^":"Tp:10;",
+$1:function(a){return J.jH(a)},
 $isEH:true},
 e156:{
-"^":"Xs:30;",
-$1:function(a){return J.kS(a)},
+"^":"Tp:10;",
+$1:function(a){return J.jo(a)},
 $isEH:true},
 e157:{
-"^":"Xs:30;",
-$1:function(a){return a.gGD()},
+"^":"Tp:10;",
+$1:function(a){return a.gVc()},
 $isEH:true},
 e158:{
-"^":"Xs:30;",
-$1:function(a){return J.Td(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gpF()},
 $isEH:true},
 e159:{
-"^":"Xs:30;",
-$1:function(a){return a.gDo()},
+"^":"Tp:10;",
+$1:function(a){return J.oL(a)},
 $isEH:true},
 e160:{
-"^":"Xs:30;",
-$1:function(a){return J.j1(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gA6()},
 $isEH:true},
 e161:{
-"^":"Xs:30;",
-$1:function(a){return J.Aw(a)},
+"^":"Tp:10;",
+$1:function(a){return J.Ry(a)},
 $isEH:true},
 e162:{
-"^":"Xs:30;",
-$1:function(a){return J.dY(a)},
+"^":"Tp:10;",
+$1:function(a){return J.UP(a)},
 $isEH:true},
 e163:{
-"^":"Xs:30;",
-$1:function(a){return J.OL(a)},
+"^":"Tp:10;",
+$1:function(a){return J.fw(a)},
 $isEH:true},
 e164:{
-"^":"Xs:30;",
-$1:function(a){return a.gki()},
+"^":"Tp:10;",
+$1:function(a){return J.zH(a)},
 $isEH:true},
 e165:{
-"^":"Xs:30;",
-$1:function(a){return a.gZn()},
+"^":"Tp:10;",
+$1:function(a){return J.Vi(a)},
 $isEH:true},
 e166:{
-"^":"Xs:30;",
-$1:function(a){return a.gvs()},
+"^":"Tp:10;",
+$1:function(a){return a.gXR()},
 $isEH:true},
 e167:{
-"^":"Xs:30;",
-$1:function(a){return a.gVh()},
+"^":"Tp:10;",
+$1:function(a){return J.P5(a)},
 $isEH:true},
 e168:{
-"^":"Xs:30;",
-$1:function(a){return a.gZX()},
+"^":"Tp:10;",
+$1:function(a){return a.gzS()},
 $isEH:true},
 e169:{
-"^":"Xs:30;",
-$1:function(a){return J.SG(a)},
+"^":"Tp:10;",
+$1:function(a){return J.iY(a)},
 $isEH:true},
 e170:{
-"^":"Xs:30;",
-$1:function(a){return J.eU(a)},
+"^":"Tp:10;",
+$1:function(a){return J.u9(a)},
 $isEH:true},
 e171:{
-"^":"Xs:30;",
-$1:function(a){return a.gVF()},
+"^":"Tp:10;",
+$1:function(a){return J.U8(a)},
 $isEH:true},
 e172:{
-"^":"Xs:30;",
-$1:function(a){return a.gkw()},
+"^":"Tp:10;",
+$1:function(a){return J.oN(a)},
 $isEH:true},
 e173:{
-"^":"Xs:30;",
-$1:function(a){return J.K2(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gV8()},
 $isEH:true},
 e174:{
-"^":"Xs:30;",
-$1:function(a){return J.uy(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gGD()},
 $isEH:true},
 e175:{
-"^":"Xs:30;",
-$1:function(a){return a.gEy()},
+"^":"Tp:10;",
+$1:function(a){return J.Td(a)},
 $isEH:true},
 e176:{
-"^":"Xs:30;",
-$1:function(a){return J.Kd(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gDo()},
 $isEH:true},
 e177:{
-"^":"Xs:30;",
-$1:function(a){return J.Sl(a)},
+"^":"Tp:10;",
+$1:function(a){return J.j1(a)},
 $isEH:true},
 e178:{
-"^":"Xs:30;",
-$1:function(a){return a.gJk()},
+"^":"Tp:10;",
+$1:function(a){return J.Aw(a)},
 $isEH:true},
 e179:{
-"^":"Xs:30;",
-$1:function(a){return J.Nl(a)},
+"^":"Tp:10;",
+$1:function(a){return J.dY(a)},
 $isEH:true},
 e180:{
-"^":"Xs:30;",
-$1:function(a){return a.gFc()},
+"^":"Tp:10;",
+$1:function(a){return J.OL(a)},
 $isEH:true},
 e181:{
-"^":"Xs:30;",
-$1:function(a){return a.gZ3()},
+"^":"Tp:10;",
+$1:function(a){return a.gki()},
 $isEH:true},
 e182:{
-"^":"Xs:30;",
-$1:function(a){return a.gYe()},
+"^":"Tp:10;",
+$1:function(a){return a.gZn()},
 $isEH:true},
 e183:{
-"^":"Xs:30;",
-$1:function(a){return J.I2(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gvs()},
 $isEH:true},
 e184:{
-"^":"Xs:30;",
-$1:function(a){return a.gzz()},
+"^":"Tp:10;",
+$1:function(a){return a.gVh()},
 $isEH:true},
 e185:{
-"^":"Xs:50;",
-$2:function(a,b){J.Ex(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gZX()},
 $isEH:true},
 e186:{
-"^":"Xs:50;",
-$2:function(a,b){J.a8(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.SG(a)},
 $isEH:true},
 e187:{
-"^":"Xs:50;",
-$2:function(a,b){J.oO(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.eU(a)},
 $isEH:true},
 e188:{
-"^":"Xs:50;",
-$2:function(a,b){J.l7(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gVF()},
 $isEH:true},
 e189:{
-"^":"Xs:50;",
-$2:function(a,b){J.kB(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gkw()},
 $isEH:true},
 e190:{
-"^":"Xs:50;",
-$2:function(a,b){J.Ae(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.K2(a)},
 $isEH:true},
 e191:{
-"^":"Xs:50;",
-$2:function(a,b){J.IX(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.uy(a)},
 $isEH:true},
 e192:{
-"^":"Xs:50;",
-$2:function(a,b){J.WI(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gEy()},
 $isEH:true},
 e193:{
-"^":"Xs:50;",
-$2:function(a,b){J.o0(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.Kd(a)},
 $isEH:true},
 e194:{
-"^":"Xs:50;",
-$2:function(a,b){J.fH(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.Sl(a)},
 $isEH:true},
 e195:{
-"^":"Xs:50;",
-$2:function(a,b){J.Fg(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gJk()},
 $isEH:true},
 e196:{
-"^":"Xs:50;",
-$2:function(a,b){J.Zg(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.Nl(a)},
 $isEH:true},
 e197:{
-"^":"Xs:50;",
-$2:function(a,b){J.LM(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gFc()},
 $isEH:true},
 e198:{
-"^":"Xs:50;",
-$2:function(a,b){J.qq(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gYY()},
 $isEH:true},
 e199:{
-"^":"Xs:50;",
-$2:function(a,b){J.Pk(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gZ3()},
 $isEH:true},
 e200:{
-"^":"Xs:50;",
-$2:function(a,b){J.Yz(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gYe()},
 $isEH:true},
 e201:{
-"^":"Xs:50;",
-$2:function(a,b){a.sw2(b)},
+"^":"Tp:10;",
+$1:function(a){return J.I2(a)},
 $isEH:true},
 e202:{
-"^":"Xs:50;",
-$2:function(a,b){J.Qr(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gzz()},
 $isEH:true},
 e203:{
-"^":"Xs:50;",
-$2:function(a,b){J.P6(a,b)},
+"^":"Tp:10;",
+$1:function(a){return J.tp(a)},
 $isEH:true},
 e204:{
-"^":"Xs:50;",
-$2:function(a,b){J.BC(a,b)},
+"^":"Tp:10;",
+$1:function(a){return a.gaU()},
 $isEH:true},
 e205:{
-"^":"Xs:50;",
-$2:function(a,b){J.VJ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.RX(a,b)},
 $isEH:true},
 e206:{
-"^":"Xs:50;",
-$2:function(a,b){J.Qf(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.a8(a,b)},
 $isEH:true},
 e207:{
-"^":"Xs:50;",
-$2:function(a,b){J.Sm(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.oO(a,b)},
 $isEH:true},
 e208:{
-"^":"Xs:50;",
-$2:function(a,b){J.JZ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.l7(a,b)},
 $isEH:true},
 e209:{
-"^":"Xs:50;",
-$2:function(a,b){a.shY(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.kB(a,b)},
 $isEH:true},
 e210:{
-"^":"Xs:50;",
-$2:function(a,b){J.Nf(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Ae(a,b)},
 $isEH:true},
 e211:{
-"^":"Xs:50;",
-$2:function(a,b){J.Pl(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.IX(a,b)},
 $isEH:true},
 e212:{
-"^":"Xs:50;",
-$2:function(a,b){J.Pq(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.WI(a,b)},
 $isEH:true},
 e213:{
-"^":"Xs:50;",
-$2:function(a,b){J.ye(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.o0(a,b)},
 $isEH:true},
 e214:{
-"^":"Xs:50;",
-$2:function(a,b){J.Nh(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.fH(a,b)},
 $isEH:true},
 e215:{
-"^":"Xs:50;",
-$2:function(a,b){a.sHP(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Sf(a,b)},
 $isEH:true},
 e216:{
-"^":"Xs:50;",
-$2:function(a,b){J.AI(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.qA(a,b)},
 $isEH:true},
 e217:{
-"^":"Xs:50;",
-$2:function(a,b){J.nA(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.LM(a,b)},
 $isEH:true},
 e218:{
-"^":"Xs:50;",
-$2:function(a,b){J.fb(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.qq(a,b)},
 $isEH:true},
 e219:{
-"^":"Xs:50;",
-$2:function(a,b){J.tv(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Pk(a,b)},
 $isEH:true},
 e220:{
-"^":"Xs:50;",
-$2:function(a,b){a.siq(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Yz(a,b)},
 $isEH:true},
 e221:{
-"^":"Xs:50;",
-$2:function(a,b){J.Qy(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.sw2(b)},
 $isEH:true},
 e222:{
-"^":"Xs:50;",
-$2:function(a,b){a.sKt(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Qr(a,b)},
 $isEH:true},
 e223:{
-"^":"Xs:50;",
-$2:function(a,b){J.Oo(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.xW(a,b)},
 $isEH:true},
 e224:{
-"^":"Xs:50;",
-$2:function(a,b){J.vU(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.BC(a,b)},
 $isEH:true},
 e225:{
-"^":"Xs:50;",
-$2:function(a,b){J.pj(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.VJ(a,b)},
 $isEH:true},
 e226:{
-"^":"Xs:50;",
-$2:function(a,b){J.uM(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.NO(a,b)},
 $isEH:true},
 e227:{
-"^":"Xs:50;",
-$2:function(a,b){J.Er(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.WB(a,b)},
 $isEH:true},
 e228:{
-"^":"Xs:50;",
-$2:function(a,b){J.GZ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.JZ(a,b)},
 $isEH:true},
 e229:{
-"^":"Xs:50;",
-$2:function(a,b){J.hS(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.fR(a,b)},
 $isEH:true},
 e230:{
-"^":"Xs:50;",
-$2:function(a,b){a.sSK(b)},
+"^":"Tp:67;",
+$2:function(a,b){a.shY(b)},
 $isEH:true},
 e231:{
-"^":"Xs:50;",
-$2:function(a,b){a.shX(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.LP(a,b)},
 $isEH:true},
 e232:{
-"^":"Xs:50;",
-$2:function(a,b){J.cl(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.GF(a,b)},
 $isEH:true},
 e233:{
-"^":"Xs:50;",
-$2:function(a,b){J.Jb(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Nf(a,b)},
 $isEH:true},
 e234:{
-"^":"Xs:50;",
-$2:function(a,b){J.qr(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Pl(a,b)},
 $isEH:true},
 e235:{
-"^":"Xs:50;",
-$2:function(a,b){J.jM(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.C3(a,b)},
 $isEH:true},
 e236:{
-"^":"Xs:50;",
-$2:function(a,b){J.A4(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.xH(a,b)},
 $isEH:true},
 e237:{
-"^":"Xs:50;",
-$2:function(a,b){J.wD(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Nh(a,b)},
 $isEH:true},
 e238:{
-"^":"Xs:50;",
-$2:function(a,b){J.wJ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.sHP(b)},
 $isEH:true},
 e239:{
-"^":"Xs:50;",
-$2:function(a,b){J.oJ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.AI(a,b)},
 $isEH:true},
 e240:{
-"^":"Xs:50;",
-$2:function(a,b){J.DF(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.nA(a,b)},
 $isEH:true},
 e241:{
-"^":"Xs:50;",
-$2:function(a,b){J.mb(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.fb(a,b)},
 $isEH:true},
 e242:{
-"^":"Xs:50;",
-$2:function(a,b){a.sL1(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.tv(a,b)},
 $isEH:true},
 e243:{
-"^":"Xs:50;",
-$2:function(a,b){J.XF(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.siq(b)},
 $isEH:true},
 e244:{
-"^":"Xs:50;",
-$2:function(a,b){J.SF(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Qy(a,b)},
 $isEH:true},
 e245:{
-"^":"Xs:50;",
-$2:function(a,b){J.HF(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.sKt(b)},
 $isEH:true},
 e246:{
-"^":"Xs:50;",
-$2:function(a,b){J.Xg(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Oo(a,b)},
 $isEH:true},
 e247:{
-"^":"Xs:50;",
-$2:function(a,b){J.CJ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.mU(a,b)},
 $isEH:true},
 e248:{
-"^":"Xs:50;",
-$2:function(a,b){J.P2(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Kz(a,b)},
 $isEH:true},
 e249:{
-"^":"Xs:50;",
-$2:function(a,b){J.fv(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.uM(a,b)},
 $isEH:true},
 e250:{
-"^":"Xs:50;",
-$2:function(a,b){J.kT(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Er(a,b)},
 $isEH:true},
 e251:{
-"^":"Xs:50;",
-$2:function(a,b){J.Sj(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.uX(a,b)},
 $isEH:true},
 e252:{
-"^":"Xs:50;",
-$2:function(a,b){J.AJ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.hS(a,b)},
 $isEH:true},
 e253:{
-"^":"Xs:50;",
-$2:function(a,b){J.w7(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.sSK(b)},
 $isEH:true},
 e254:{
-"^":"Xs:50;",
-$2:function(a,b){J.ME(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.shX(b)},
 $isEH:true},
 e255:{
-"^":"Xs:50;",
-$2:function(a,b){J.kX(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.cl(a,b)},
 $isEH:true},
 e256:{
-"^":"Xs:50;",
-$2:function(a,b){J.S5(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Jb(a,b)},
 $isEH:true},
 e257:{
-"^":"Xs:50;",
-$2:function(a,b){J.q0(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.k7(a,b)},
 $isEH:true},
 e258:{
-"^":"Xs:50;",
-$2:function(a,b){J.EJ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.MX(a,b)},
 $isEH:true},
 e259:{
-"^":"Xs:50;",
-$2:function(a,b){J.iH(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.A4(a,b)},
 $isEH:true},
 e260:{
-"^":"Xs:50;",
-$2:function(a,b){J.Hr(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.wD(a,b)},
 $isEH:true},
 e261:{
-"^":"Xs:50;",
-$2:function(a,b){J.R6(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.wJ(a,b)},
 $isEH:true},
 e262:{
-"^":"Xs:50;",
-$2:function(a,b){a.sVc(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.oJ(a,b)},
 $isEH:true},
 e263:{
-"^":"Xs:50;",
-$2:function(a,b){J.By(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.DF(a,b)},
 $isEH:true},
 e264:{
-"^":"Xs:50;",
-$2:function(a,b){J.M3(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Mi(a,b)},
 $isEH:true},
 e265:{
-"^":"Xs:50;",
-$2:function(a,b){J.JV(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){a.sL1(b)},
 $isEH:true},
 e266:{
-"^":"Xs:50;",
-$2:function(a,b){J.ry(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.XF(a,b)},
 $isEH:true},
 e267:{
-"^":"Xs:50;",
-$2:function(a,b){J.C5(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.SF(a,b)},
 $isEH:true},
 e268:{
-"^":"Xs:50;",
-$2:function(a,b){J.Tx(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Qv(a,b)},
 $isEH:true},
 e269:{
-"^":"Xs:50;",
-$2:function(a,b){a.sDo(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Xg(a,b)},
 $isEH:true},
 e270:{
-"^":"Xs:50;",
-$2:function(a,b){J.H3(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.aw(a,b)},
 $isEH:true},
 e271:{
-"^":"Xs:50;",
-$2:function(a,b){J.t3(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.CJ(a,b)},
 $isEH:true},
 e272:{
-"^":"Xs:50;",
-$2:function(a,b){J.GT(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.P2(a,b)},
 $isEH:true},
 e273:{
-"^":"Xs:50;",
-$2:function(a,b){a.sVF(b)},
+"^":"Tp:67;",
+$2:function(a,b){J.fv(a,b)},
 $isEH:true},
 e274:{
-"^":"Xs:50;",
-$2:function(a,b){J.yO(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.PP(a,b)},
 $isEH:true},
 e275:{
-"^":"Xs:50;",
-$2:function(a,b){J.ZU(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.Sj(a,b)},
 $isEH:true},
 e276:{
-"^":"Xs:50;",
-$2:function(a,b){J.Jn(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){J.AJ(a,b)},
 $isEH:true},
 e277:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.w7(a,b)},
 $isEH:true},
 e278:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.ME(a,b)},
 $isEH:true},
 e279:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.kX(a,b)},
 $isEH:true},
 e280:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.S5(a,b)},
 $isEH:true},
 e281:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.q0(a,b)},
 $isEH:true},
 e282:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("nav-bar",C.Zj)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.EJ(a,b)},
 $isEH:true},
 e283:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.iH(a,b)},
 $isEH:true},
 e284:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.B9(a,b)},
 $isEH:true},
 e285:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.PN(a,b)},
 $isEH:true},
 e286:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){a.sVc(b)},
 $isEH:true},
 e287:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.By(a,b)},
 $isEH:true},
 e288:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.jd(a,b)},
 $isEH:true},
 e289:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.Rx(a,b)},
 $isEH:true},
 e290:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.ZI(a,b)},
 $isEH:true},
 e291:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.wg(a,b)},
 $isEH:true},
 e292:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.fa(a,b)},
 $isEH:true},
 e293:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.Cu(a,b)},
 $isEH:true},
 e294:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){a.sV8(b)},
 $isEH:true},
 e295:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.Tx(a,b)},
 $isEH:true},
 e296:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){a.sDo(b)},
 $isEH:true},
 e297:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.H3(a,b)},
 $isEH:true},
 e298:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.t3(a,b)},
 $isEH:true},
 e299:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.GT(a,b)},
 $isEH:true},
 e300:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){a.sVF(b)},
 $isEH:true},
 e301:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("collapsible-content",C.bh)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.yO(a,b)},
 $isEH:true},
 e302:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.ZU(a,b)},
 $isEH:true},
 e303:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.tQ(a,b)},
 $isEH:true},
 e304:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("script-inset",C.Zt)},"$0",null,0,0,null,"call"],
+"^":"Tp:67;",
+$2:function(a,b){J.tH(a,b)},
 $isEH:true},
 e305:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e306:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e307:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e308:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e309:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e310:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("io-http-server-view",C.Wh)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("nav-bar",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e311:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e312:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e313:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e314:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e315:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.TU)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e316:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.BV)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e317:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e318:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("instance-view",C.k5)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e319:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e320:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e321:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e322:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e323:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e324:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e325:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e326:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e327:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e328:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e329:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("response-viewer",C.Vh)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("collapsible-content",C.bh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e330:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e331:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e332:{
-"^":"Xs:47;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+"^":"Tp:64;",
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e333:{
-"^":"Xs:47;",
+"^":"Tp:64;",
+$0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e334:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e335:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e336:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e337:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e338:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e339:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e340:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e341:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e342:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-http-server-view",C.Wh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e343:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e344:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e345:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e346:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e347:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e348:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e349:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e350:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e351:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e352:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e353:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e354:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e355:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e356:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e357:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e358:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e359:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-shared-summary",C.TU)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e360:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-counter-chart",C.z7)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e361:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e362:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("instance-view",C.k5)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e363:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e364:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e365:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e366:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e367:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e368:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e369:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e370:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e371:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e372:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("response-viewer",C.Vh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e373:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e374:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e375:{
+"^":"Tp:64;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e376:{
+"^":"Tp:64;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
 $isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
@@ -3734,9 +3916,9 @@
 "^":"Vf;BW,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 grs:function(a){return a.BW},
 srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-RF:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,15,65],
-static:{Dw:function(a){var z,y,x,w
-z=$.Nd()
+RF:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,17,82],
+static:{KU:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3754,7 +3936,7 @@
 eW:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 static:{rt:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3771,11 +3953,11 @@
 "^":"Vfx;yB,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gRu:function(a){return a.yB},
 sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
-vV:[function(a,b){return J.aT(a.yB).ox(J.WB(J.F8(a.yB),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,66,67],
-S1:[function(a,b){return J.aT(a.yB).ox(J.WB(J.F8(a.yB),"/retained"))},"$1","ghN",2,0,66,68],
-RF:[function(a,b){J.LE(a.yB).wM(b)},"$1","gvC",2,0,15,65],
-static:{zB:function(a){var z,y,x,w
-z=$.Nd()
+vV:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,83,84],
+S1:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/retained"))},"$1","ghN",2,0,83,85],
+RF:[function(a,b){J.LE(a.yB).wM(b)},"$1","gvC",2,0,17,82],
+static:{zg:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3794,9 +3976,9 @@
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gtT:function(a){return a.tY},
 Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gLe",2,0,30,34],
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,10,54],
 static:{On:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3817,8 +3999,8 @@
 Z.uL.prototype.q0.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.Ma())},
-RF:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,15,65],
+J.SK(z).ml(new F.aa())},
+RF:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,17,82],
 m2:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
@@ -3828,12 +4010,12 @@
 return x},
 YI:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gKJ",6,0,69,1,70,71],
+J.pP(z).h(0,"highlight")},"$3","gKJ",6,0,86,1,87,88],
 ZC:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,69,1,70,71],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,86,1,87,88],
 static:{f9:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3847,9 +4029,9 @@
 Dsd:{
 "^":"uL+Pi;",
 $isd3:true},
-Ma:{
-"^":"Xs:72;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,55,"call"],
+aa:{
+"^":"Tp:89;",
+$1:[function(a){a.OF()},"$1",null,2,0,null,72,"call"],
 $isEH:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
@@ -3865,7 +4047,7 @@
 a.VA=this.ct(a,C.PI,a.VA,"none")}else{a.Xf=this.ct(a,C.Ms,z,"glyphicon glyphicon-chevron-up")
 a.VA=this.ct(a,C.PI,a.VA,"block")}},
 static:{"^":"ALz,DI",IT:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3884,7 +4066,7 @@
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 JI:{
-"^":"Nr;GV,uo,nx,oM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"Xfs;GV,uo,nx,oM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 goE:function(a){return a.GV},
 soE:function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},
 gv8:function(a){return a.uo},
@@ -3895,18 +4077,18 @@
 sFR:function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
-tn:[function(a,b){var z=a.oM
-a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,15,34],
+na:[function(a,b){var z=a.oM
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,17,54],
 Db:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,13],
+a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,15],
 AZ:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.gN2(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,54,22,23,55],
-static:{p7:function(a){var z,y,x,w
-z=$.Nd()
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,71,43,44,72],
+static:{U9:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -3921,41 +4103,34 @@
 C.O0.ZL(a)
 C.O0.XI(a)
 return a}}},
-Nr:{
+Xfs:{
 "^":"ir+Pi;",
 $isd3:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
 bQ:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
-Ck:function(a,b){var z
+qo:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
 return!1},
 n3:function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
 return b},
-mx:function(a,b,c){var z,y,x
-for(y=0;x=$.ng(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
-z=P.p9("")
-try{$.ng().push(a)
-z.KF(b)
-z.We(a,", ")
-z.KF(c)}finally{x=$.ng()
-if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},
+rd:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},
 xF:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 z=J.Wx(c)
 if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},
 qG:function(a,b,c,d,e){var z,y,x,w
 H.xF(a,b,c)
-z=J.xH(c,b)
+z=J.Hn(c,b)
 if(J.xC(z,0))return
 if(J.u6(e,0))throw H.b(P.u(e))
 y=J.x(d)
 if(!!y.$isWO){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
-x=0}if(J.xZ(J.WB(x,z),J.q8(w)))throw H.b(H.ar())
-H.Gj(w,x,a,b,z)},
+x=0}if(J.z8(J.ew(x,z),J.q8(w)))throw H.b(H.ar())
+H.tb(w,x,a,b,z)},
 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))
@@ -3971,18 +4146,18 @@
 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.gl()
-u=J.WB(b,1)
+u=J.ew(b,1)
 C.Nm.u(a,b,v)}},
-xr:function(a,b,c){var z,y
+aB: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.mY(c);z.G();b=y){y=b+1
 C.Nm.u(a,b,z.gl())}},
 DU:function(){return new P.lj("No element")},
 ar:function(){return new P.lj("Too few elements")},
-Gj:function(a,b,c,d,e){var z,y,x,w,v
+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))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},
+if(z.C(b,d))for(y=J.Hn(z.g(b,e),1),x=J.Hn(J.ew(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.Hn(x,1))C.Nm.u(c,x,z.t(a,y))
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.ew(x,1))C.Nm.u(c,x,w.t(a,y))},
 TK:function(a,b,c,d){var z
 if(c>=a.length)return-1
 for(z=c;z<d;++z){if(z>=a.length)return H.e(a,z)
@@ -3999,7 +4174,7 @@
 w9:function(a,b,c,d){var z,y,x,w,v
 for(z=b+1,y=J.U6(a);z<=c;++z){x=y.t(a,z)
 w=z
-while(!0){if(!(w>b&&J.xZ(d.$2(y.t(a,w-1),x),0)))break
+while(!0){if(!(w>b&&J.z8(d.$2(y.t(a,w-1),x),0)))break
 v=w-1
 y.u(a,w,y.t(a,v))
 w=v}y.u(a,w,x)}},
@@ -4016,23 +4191,23 @@
 q=t.t(a,w)
 p=t.t(a,u)
 o=t.t(a,x)
-if(J.xZ(d.$2(s,r),0)){n=r
+if(J.z8(d.$2(s,r),0)){n=r
 r=s
-s=n}if(J.xZ(d.$2(p,o),0)){n=o
+s=n}if(J.z8(d.$2(p,o),0)){n=o
 o=p
-p=n}if(J.xZ(d.$2(s,q),0)){n=q
+p=n}if(J.z8(d.$2(s,q),0)){n=q
 q=s
-s=n}if(J.xZ(d.$2(r,q),0)){n=q
+s=n}if(J.z8(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.xZ(d.$2(s,p),0)){n=p
+r=n}if(J.z8(d.$2(s,p),0)){n=p
 p=s
-s=n}if(J.xZ(d.$2(q,p),0)){n=p
+s=n}if(J.z8(d.$2(q,p),0)){n=p
 p=q
-q=n}if(J.xZ(d.$2(r,o),0)){n=o
+q=n}if(J.z8(d.$2(r,o),0)){n=o
 o=r
-r=n}if(J.xZ(d.$2(r,q),0)){n=q
+r=n}if(J.z8(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.xZ(d.$2(p,o),0)){n=o
+r=n}if(J.z8(d.$2(p,o),0)){n=o
 o=p
 p=n}t.u(a,y,s)
 t.u(a,w,q)
@@ -4061,7 +4236,7 @@
 l=g
 break}}}}e=!0}else{for(k=m;k<=l;++k){j=t.t(a,k)
 if(J.u6(d.$2(j,r),0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else if(J.xZ(d.$2(j,p),0))for(;!0;)if(J.xZ(d.$2(t.t(a,l),p),0)){--l
+t.u(a,m,j)}++m}else if(J.z8(d.$2(j,p),0))for(;!0;)if(J.z8(d.$2(t.t(a,l),p),0)){--l
 if(l<k)break
 continue}else{g=l-1
 if(J.u6(d.$2(t.t(a,l),r),0)){t.u(a,k,t.t(a,m))
@@ -4106,7 +4281,7 @@
 if(z!==this.gB(this))throw H.b(P.a4(this))}},
 gl0:function(a){return J.xC(this.gB(this),0)},
 grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
-return this.Zv(0,J.xH(this.gB(this),1))},
+return this.Zv(0,J.Hn(this.gB(this),1))},
 tg:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -4138,7 +4313,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.lJ(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.cX,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},46],
+ez:[function(a,b){return H.VM(new H.lJ(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},28],
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -4159,31 +4334,31 @@
 gMa:function(){var z,y
 z=J.q8(this.l6)
 y=this.AN
-if(y==null||J.xZ(y,z))return z
+if(y==null||J.z8(y,z))return z
 return y},
 gjX:function(){var z,y
 z=J.q8(this.l6)
 y=this.SH
-if(J.xZ(y,z))return z
+if(J.z8(y,z))return z
 return y},
 gB:function(a){var z,y,x
 z=J.q8(this.l6)
 y=this.SH
 if(J.J5(y,z))return 0
 x=this.AN
-if(x==null||J.J5(x,z))return J.xH(z,y)
-return J.xH(x,y)},
-Zv:function(a,b){var z=J.WB(this.gjX(),b)
+if(x==null||J.J5(x,z))return J.Hn(z,y)
+return J.Hn(x,y)},
+Zv:function(a,b){var z=J.ew(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.i9(this.l6,z)},
 eR:function(a,b){if(J.u6(b,0))throw H.b(P.N(b))
-return H.j5(this.l6,J.WB(this.SH,b),this.AN,null)},
+return H.j5(this.l6,J.ew(this.SH,b),this.AN,null)},
 qZ:function(a,b){var z,y,x
 if(b<0)throw H.b(P.N(b))
 z=this.AN
 y=this.SH
-if(z==null)return H.j5(this.l6,y,J.WB(y,b),null)
-else{x=J.WB(y,b)
+if(z==null)return H.j5(this.l6,y,J.ew(y,b),null)
+else{x=J.ew(y,b)
 if(J.u6(z,x))return this
 return H.j5(this.l6,y,x,null)}},
 Hd:function(a,b,c,d){var z,y,x
@@ -4216,24 +4391,24 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return J.q8(this.l6)},
-gl0:function(a){return J.FN(this.l6)},
+gl0:function(a){return J.tx(this.l6)},
 grZ:function(a){return this.mb(J.MQ(this.l6))},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 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",
 $isyN:true},
 MH:{
-"^":"AC;lo,OI,T6",
+"^":"Yl;lo,OI,T6",
 mb:function(a){return this.T6.$1(a)},
 G:function(){var z=this.OI
 if(z.G()){this.lo=this.mb(z.gl())
 return!0}this.lo=null
 return!1},
 gl:function(){return this.lo},
-$asAC:function(a,b){return[b]}},
+$asYl:function(a,b){return[b]}},
 lJ:{
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.$1(a)},
@@ -4241,7 +4416,7 @@
 Zv:function(a,b){return this.mb(J.i9(this.CR,b))},
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 $isyN:true},
 U5:{
 "^":"mW;l6,T6",
@@ -4249,19 +4424,19 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 SO:{
-"^":"AC;OI,T6",
+"^":"Yl;OI,T6",
 mb:function(a){return this.T6.$1(a)},
 G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
 return!1},
 gl:function(){return this.OI.gl()}},
 zs:{
 "^":"mW;l6,T6",
-gA:function(a){var z=new H.rR(J.mY(this.l6),this.T6,C.Gw,null)
+gA:function(a){var z=new H.yY(J.mY(this.l6),this.T6,C.Gw,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]}},
-rR:{
+$asQV:function(a,b){return[b]}},
+yY:{
 "^":"a;OI,T6,e0,lo",
 mb:function(a){return this.T6.$1(a)},
 gl:function(){return this.lo},
@@ -4281,18 +4456,18 @@
 "^":"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"))},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
 UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-Zl:{
+JJ:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+Yj:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 XP:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
@@ -4304,15 +4479,15 @@
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
-XC:{
-"^":"rm+Zl;",
+$isQV:true,
+$asQV:null},
+w2Y:{
+"^":"rm+JJ;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 iK:{
 "^":"aL;CR",
 gB:function(a){return J.q8(this.CR)},
@@ -4332,25 +4507,24 @@
 bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
 $isGD:true,
 $isIN:true,
-static:{"^":"RWj,ES1,quP,KGP,q3,CI"}}}],["dart._js_names","dart:_js_names",,H,{
+static:{"^":"RWj,ES1,quP,KGP,q3,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
 "^":"",
 kU:function(a){var z=H.VM(function(b,c){var y=[]
 for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
 return z}}],["dart.async","dart:async",,P,{
 "^":"",
-C2:function(){if($.jk().scheduleImmediate!=null)return P.vd()
+xg:function(){if($.jk().scheduleImmediate!=null)return P.vd()
 return P.K7()},
 ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,14],
-Bz:[function(a){P.jL(C.RT,a)},"$1","K7",2,0,14],
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,16],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,16],
 VH:function(a,b){var z=H.G3()
 z=H.KT(z,[z,z]).BD(a)
-if(z){b.toString
-return a}else{b.toString
-return a}},
+if(z)return b.O8(a)
+else return b.wY(a)},
 Iw:function(a,b){var z=P.Dt(b)
-P.ww(C.RT,new P.w4(a,z))
+P.ww(C.ny,new P.w4(a,z))
 return z},
 Cx:function(){var z=$.S6
 for(;z!=null;){J.cG(z)
@@ -4360,7 +4534,7 @@
 try{P.Cx()}catch(z){H.Ru(z)
 $.ej().$1(P.rh())
 $.S6=$.S6.gaw()
-throw z}},"$0","rh",0,0,13],
+throw z}},"$0","rh",0,0,15],
 IA:function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
@@ -4369,10 +4543,10 @@
 $.ej().$1(P.rh())}else{y=new P.OM(a,null)
 z.aw=y
 $.k8=y}},
-rb:function(a){var z=$.X3
-if(z===C.NU){z.toString
-P.Tk(z,null,z,a)
-return}P.Tk(z,null,z,z.xi(a,!0))},
+rb:function(a){var z
+if(J.xC($.X3,C.NU)){$.X3.wr(a)
+return}z=$.X3
+z.wr(z.xi(a,!0))},
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -4385,53 +4559,59 @@
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-v=$.X3
-v.toString
-P.CK(v,null,v,y,x)}},
-YE:[function(a){},"$1","bZ",2,0,15,16],
-vF:[function(a,b){var z=$.X3
-z.toString
-P.CK(z,null,z,a,b)},function(a){return P.vF(a,null)},null,"$2","$1","Mm",2,2,17,18,19,20],
-dL:[function(){},"$0","v3",0,0,13],
+x=new H.XO(w,null)
+$.X3.hk(y,x)}},
+SN:[function(a){},"$1","Ax",2,0,17,18],
+vF:[function(a,b){$.X3.hk(a,b)},function(a){return P.vF(a,null)},null,"$2","$1","Mm",2,2,19,20,21,22],
+p0:[function(){},"$0","od",0,0,15],
 FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
+y=new H.XO(x,null)
 c.$2(z,y)}},
 NX:function(a,b,c,d){a.ed()
 b.K5(c,d)},
 TB:function(a,b){return new P.uR(a,b)},
 Bb:function(a,b,c){a.ed()
 b.rX(c)},
-ww:function(a,b){var z=$.X3
-if(z===C.NU){z.toString
-return P.h8(z,null,z,a,b)}return P.h8(z,null,z,a,z.xi(b,!0))},
-jL:function(a,b){var z=C.CD.cU(a.Fq,1000)
+ww:function(a,b){var z
+if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
+z=$.X3
+return z.uN(a,z.xi(b,!0))},
+jL:function(a,b){var z=a.gVs()
 return H.cy(z<0?0:z,b)},
-qi:function(a){var z=$.X3
+Us:function(a){var z=$.X3
 $.X3=a
 return z},
-CK:function(a,b,c,d,e){P.T8(a,null,a,new P.FO(d,e))},
-T8:function(a,b,c,d){var z,y
-if($.X3===c)return d.$0()
-z=P.qi(c)
+CK:[function(a,b,c,d,e){a.Gr(new P.FO(d,e))},"$5","wL",10,0,23,24,25,26,21,22],
+T8:[function(a,b,c,d){var z,y
+if(J.xC($.X3,c))return d.$0()
+z=P.Us(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},
-V7:function(a,b,c,d,e){var z,y
-if($.X3===c)return d.$1(e)
-z=P.qi(c)
+return y}finally{$.X3=z}},"$4","lw",8,0,27,24,25,26,28],
+V7:[function(a,b,c,d,e){var z,y
+if(J.xC($.X3,c))return d.$1(e)
+z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},
-Mu:function(a,b,c,d,e,f){var z,y
-if($.X3===c)return d.$2(e,f)
-z=P.qi(c)
+return y}finally{$.X3=z}},"$5","MM",10,0,29,24,25,26,28,30],
+Mu:[function(a,b,c,d,e,f){var z,y
+if(J.xC($.X3,c))return d.$2(e,f)
+z=P.Us(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},
-Tk:function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},
-h8:function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},
+return y}finally{$.X3=z}},"$6","iy",12,0,31,24,25,26,28,6,7],
+Ee:[function(a,b,c,d){return d},"$4","Qk",8,0,32,24,25,26,28],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,33,24,25,26,28],
+dL:[function(a,b,c,d){return d},"$4","v3",8,0,34,24,25,26,28],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,35],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,36,24,25,26,37,38],
+XB:[function(a,b,c,d){H.qw(d)},"$4","aW",8,0,39],
+CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,40],
+UA:[function(a,b,c,d,e){var z
+$.oK=P.jt()
+z=P.YM(null,null,null,null,null)
+return new P.uo(c,d,z)},"$5","Is",10,0,41],
 C6:{
-"^":"Xs:47;a",
+"^":"Tp:64;a",
 $0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -4440,8 +4620,8 @@
 $isXS:true},
 Ik:{
 "^":"O9;Y8"},
-f6:{
-"^":"oh;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
+LR:{
+"^":"oh;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,nb",
 gY8:function(){return this.Y8},
 uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
@@ -4458,9 +4638,9 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,13],
-LP:[function(){},"$0","gZ9",0,0,13],
-static:{"^":"FJ,H6,id"}},
+uO:[function(){},"$0","gp4",0,0,15],
+LP:[function(){},"$0","gZ9",0,0,15],
+static:{"^":"E2b,H6,id"}},
 WV:{
 "^":"a;iE@,SJ@",
 gUF:function(){return!1},
@@ -4483,9 +4663,9 @@
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WV")},73],
-zw:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.NA(a,b)},function(a){return this.zw(a,null)},"JT","$2","$1","gGj",2,2,74,18,19,20],
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WV")},90],
+js:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
+this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,91,20,21,22],
 S6:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.yx
@@ -4495,7 +4675,7 @@
 this.Pl()
 return y},
 Rg:function(a){this.Iv(a)},
-V8:function(a,b){this.NA(a,b)},
+oJ:function(a,b){this.pb(a,b)},
 YB:function(){var z=this.WX
 this.WX=null
 this.Gv&=4294967287
@@ -4521,9 +4701,9 @@
 this.Gv&=4294967293
 if(this.iE===this)this.Of()},
 Of:function(){if((this.Gv&4)!==0&&this.yx.Gv===0)this.yx.OH(null)
-P.ot(this.QC)}},
+P.ot(this.Ym)}},
 zW:{
-"^":"WV;nL,QC,Gv,iE,SJ,WX,yx",
+"^":"WV;nL,Ym,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv|=2
@@ -4531,65 +4711,65 @@
 this.Gv&=4294967293
 if(this.iE===this)this.Of()
 return}this.nE(new P.tK(this,a))},
-NA:function(a,b){if(this.iE===this)return
+pb:function(a,b){if(this.iE===this)return
 this.nE(new P.OR(this,a,b))},
 Pl:function(){if(this.iE!==this)this.nE(new P.eB(this))
 else this.yx.OH(null)}},
 tK:{
-"^":"Xs;a,b",
+"^":"Tp;a,b",
 $1:function(a){a.Rg(this.b)},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Xp",args:[[P.DR,a]]}},this.a,"zW")}},
+$signature:function(){return H.IG(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 OR:{
-"^":"Xs;a,b,c",
-$1:function(a){a.V8(this.b,this.c)},
+"^":"Tp;a,b,c",
+$1:function(a){a.oJ(this.b,this.c)},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Xp",args:[[P.DR,a]]}},this.a,"zW")}},
+$signature:function(){return H.IG(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 eB:{
-"^":"Xs;a",
+"^":"Tp;a",
 $1:function(a){a.YB()},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.f6,a]]}},this.a,"zW")}},
+$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.LR,a]]}},this.a,"zW")}},
 HX:{
-"^":"WV;nL,QC,Gv,iE,SJ,WX,yx",
+"^":"WV;nL,Ym,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
 y.$builtinTypeInfo=[null]
 z.VI(y)}},
-NA:function(a,b){var z
+pb:function(a,b){var z
 for(z=this.iE;z!==this;z=z.giE())z.VI(new P.WG(a,b,null))},
 Pl:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.VI(C.Wj)
+if(z!==this)for(;z!==this;z=z.giE())z.VI(C.ZB)
 else this.yx.OH(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
 w4:{
-"^":"Xs:47;a,b",
+"^":"Tp:64;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
+y=new H.XO(x,null)
 this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 Pf0:{
 "^":"a;"},
 Zf:{
 "^":"Pf0;MM",
-j3:function(a,b){var z=this.MM
+j3:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},
+z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,92,20,18],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"rC","$2","$1","gYJ",2,2,74,18,19,20]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"rC","$2","$1","gXN",2,2,91,20,21,22]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
 gWj:function(){return this.Gv===4},
 gNm:function(){return this.Gv===8},
-sVW:function(a){if(a)this.Gv=2
+swG:function(a){if(a)this.Gv=2
 else this.Gv=0},
 gO1:function(){return this.Gv===2?null:this.OY},
 gyK:function(){return this.Gv===2?null:this.As},
@@ -4597,36 +4777,31 @@
 gIa:function(){return this.Gv===2?null:this.o4},
 Rx:function(a,b){var z,y
 z=$.X3
-z.toString
-y=H.VM(new P.vs(0,z,null,null,a,null,P.VH(b,z),null),[null])
+y=H.VM(new P.vs(0,z,null,null,z.wY(a),null,P.VH(b,$.X3),null),[null])
 this.au(y)
 return y},
 ml:function(a){return this.Rx(a,null)},
 co:function(a,b){var z,y,x
 z=$.X3
 y=P.VH(a,z)
-$.X3.toString
-x=H.VM(new P.vs(0,z,null,null,null,b,y,null),[null])
+x=H.VM(new P.vs(0,z,null,null,null,$.X3.wY(b),y,null),[null])
 this.au(x)
 return x},
 OA:function(a){return this.co(a,null)},
 wM:function(a){var z,y
 z=$.X3
-z.toString
-y=new P.vs(0,z,null,null,null,null,null,a)
+y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
 return y},
 gDL:function(){return this.jk},
 gcG:function(){return this.jk},
-At:function(a){this.Gv=4
+Am:function(a){this.Gv=4
 this.jk=a},
 E6:function(a,b){this.Gv=8
 this.jk=new P.Ca(a,b)},
-au:function(a){var z
-if(this.Gv>=4){z=this.Lj
-z.toString
-P.Tk(z,null,z,new P.da(this,a))}else{a.sBQ(this.jk)
+au:function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
+else{a.sBQ(this.jk)
 this.jk=a}},
 L3:function(){var z,y,x
 z=this.jk
@@ -4638,222 +4813,190 @@
 if(!!z.$isb8)if(!!z.$isvs)P.A9(a,this)
 else P.k3(a,this)
 else{y=this.L3()
-this.At(a)
+this.Am(a)
 P.HZ(this,y)}},
 R8:function(a){var z=this.L3()
-this.At(a)
+this.Am(a)
 P.HZ(this,z)},
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,17,18,19,20],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,19,20,21,22],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 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
-z=this.Lj
-z.toString
-P.Tk(z,null,z,new P.pZ(this,a))}else P.A9(a,this)}else P.k3(a,this)
+this.Lj.wr(new P.cX(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
-z=this.Lj
-z.toString
-P.Tk(z,null,z,new P.jq(this,a))},
-CG:function(a,b){var z
-if(this.Gv!==0)H.vh(P.w("Future already completed"))
+this.Lj.wr(new P.eX(this,a))},
+CG:function(a,b){if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
-z=this.Lj
-z.toString
-P.Tk(z,null,z,new P.In(this,a,b))},
-L7:function(a,b){this.OH(a)},
+this.Lj.wr(new P.In(this,a,b))},
+J9:function(a,b){this.OH(a)},
 X8:function(a,b,c){this.CG(a,b)},
 $isvs:true,
 $isb8:true,
 static:{"^":"ewM,JE,C3n,Xh,NKU",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},PG:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
-z.L7(a,b)
+z.J9(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
-return z},k3:function(a,b){b.sVW(!0)
-a.Rx(new P.pV(b),new P.U7(b))},A9:function(a,b){b.sVW(!0)
+return z},k3:function(a,b){b.swG(!0)
+a.Rx(new P.U7(b),new P.vr(b))},A9:function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
 else a.au(b)},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)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
 if(!y.gcg())return
 w=z.e.gNm()
 if(w&&b==null){v=z.e.gcG()
-y=z.e.gLj()
-x=J.w8(v)
-u=v.gI4()
-y.toString
-P.CK(y,null,y,x,u)
+z.e.gLj().hk(J.w8(v),v.gI4())
 return}if(b==null)return
 if(b.gBQ()!=null){P.yE(z.e,b)
 return}x.b=!0
-t=z.e.gWj()?z.e.gDL():null
-x.c=t
+u=z.e.gWj()?z.e.gDL():null
+x.c=u
 x.d=!1
 y=!w
-if(!y||b.gO1()!=null||b.gIa()!=null){s=b.gLj()
-if(w){u=z.e.gLj()
-u.toString
-s.toString
-u=s==null?u!=null:s!==u}else u=!1
-if(u){v=z.e.gcG()
-y=z.e.gLj()
-x=J.w8(v)
-u=v.gI4()
-y.toString
-P.CK(y,null,y,x,u)
-return}r=$.X3
-if(r==null?s!=null:r!==s)$.X3=s
-else r=null
-if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,t,s).$0()}else new P.RW(z,x,b,s).$0()
-if(b.gIa()!=null)new P.YP(z,x,w,b,s).$0()
-if(r!=null)$.X3=r
+if(!y||b.gO1()!=null||b.gIa()!=null){t=b.gLj()
+if(w&&!z.e.gLj().fC(t)){v=z.e.gcG()
+z.e.gLj().hk(J.w8(v),v.gI4())
+return}s=$.X3
+if(s==null?t!=null:s!==t)$.X3=t
+else s=null
+if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
+if(b.gIa()!=null)new P.RT(z,x,w,b,t).$0()
+if(s!=null)$.X3=s
 if(x.d)return
 if(x.b===!0){y=x.c
-y=(t==null?y!=null:t!==y)&&!!J.x(y).$isb8}else y=!1
-if(y){q=x.c
-if(!!J.x(q).$isvs)if(q.Gv>=4){b.sVW(!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.At(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}}}},
+b=q}}}},
 da:{
-"^":"Xs:47;a,b",
+"^":"Tp:64;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
-pV:{
-"^":"Xs:30;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,16,"call"],
-$isEH:true},
 U7:{
-"^":"Xs:75;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,18,19,20,"call"],
+"^":"Tp:10;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,18,"call"],
 $isEH:true},
-pZ:{
-"^":"Xs:47;a,b",
+vr:{
+"^":"Tp:93;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,20,21,22,"call"],
+$isEH:true},
+cX:{
+"^":"Tp:64;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
-jq:{
-"^":"Xs:47;c,d",
+eX:{
+"^":"Tp:64;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 In:{
-"^":"Xs:47;a,b,c",
+"^":"Tp:64;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Xs:76;b,d,e,f",
-$0:function(){var z,y,x,w,v
-try{x=this.f
-w=this.d.gO1()
-x.toString
-this.b.c=P.V7(x,null,x,w,this.e)
-return!0}catch(v){x=H.Ru(v)
-z=x
-y=new H.oP(v,null)
+"^":"Tp:94;b,d,e,f",
+$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)
+z=w
+y=new H.XO(x,null)
 this.b.c=new P.Ca(z,y)
 return!1}},
 $isEH:true},
 RW:{
-"^":"Xs:13;c,b,UI,bK",
+"^":"Tp:15;c,b,UI,bK",
 $0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
 y=r.gyK()
 x=!0
-if(y!=null)try{q=this.bK
-p=J.w8(z)
-q.toString
-x=P.V7(q,null,q,y,p)}catch(o){r=H.Ru(o)
+if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
 w=r
-v=new H.oP(o,null)
+v=new H.XO(q,null)
 r=J.w8(z)
-q=w
-n=(r==null?q==null:r===q)?z:new P.Ca(w,v)
+p=w
+o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
 r=this.b
-r.c=n
+r.c=o
 r.b=!1
 return}u=r.go7()
 if(x===!0&&u!=null){try{r=u
-q=H.G3()
-q=H.KT(q,[q,q]).BD(r)
-p=this.bK
+p=H.G3()
+p=H.KT(p,[p,p]).BD(r)
+n=this.bK
 m=this.b
-if(q){r=J.w8(z)
-q=z.gI4()
-p.toString
-m.c=P.Mu(p,null,p,u,r,q)}else{r=J.w8(z)
-p.toString
-m.c=P.V7(p,null,p,u,r)}}catch(o){r=H.Ru(o)
+if(p)m.c=n.mg(u,J.w8(z),z.gI4())
+else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
 t=r
-s=new H.oP(o,null)
+s=new H.XO(q,null)
 r=J.w8(z)
-q=t
-n=(r==null?q==null:r===q)?z:new P.Ca(t,s)
+p=t
+o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
 r=this.b
-r.c=n
+r.c=o
 r.b=!1
 return}this.b.b=!0}else{r=this.b
 r.c=z
 r.b=!1}},
 $isEH:true},
-YP:{
-"^":"Xs:13;c,b,Gq,Rm,w3",
+RT:{
+"^":"Tp:15;c,b,Gq,Rm,w3",
 $0:function(){var z,y,x,w,v,u
 z={}
 z.a=null
-try{w=this.w3
-v=this.Rm.gIa()
-w.toString
-z.a=P.T8(w,null,w,v)}catch(u){w=H.Ru(u)
-y=w
-x=new H.oP(u,null)
-if(this.Gq){w=J.w8(this.c.e.gcG())
-v=y
-v=w==null?v==null:w===v
-w=v}else w=!1
-v=this.b
-if(w)v.c=this.c.e.gcG()
-else v.c=new P.Ca(y,x)
-v.b=!1}if(!!J.x(z.a).$isb8){w=this.Rm
-w.sVW(!0)
+try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+if(this.Gq){v=J.w8(this.c.e.gcG())
+u=y
+u=v==null?u==null:v===u
+v=u}else v=!1
+u=this.b
+if(v)u.c=this.c.e.gcG()
+else u.c=new P.Ca(y,x)
+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,w),new P.FZ(z,w))}},
+z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
 $isEH:true},
 jZ:{
-"^":"Xs:30;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,77,"call"],
+"^":"Tp:10;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,95,"call"],
 $isEH:true},
 FZ:{
-"^":"Xs:75;a,mG",
+"^":"Tp:93;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 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.$2(a,null)},"$1","$2",null,null,2,2,null,18,19,20,"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,20,21,22,"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 cb:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},78],
-Ft:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.cb,args:[{func:"Xy",ret:P.cX,args:[a]}]}},this.$receiver,"cb")},78],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},96],
+Ft:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.cb,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},96],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
@@ -4870,7 +5013,7 @@
 z={}
 y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gaq())
+z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gaq())
 return y},
 gB:function(a){var z,y
 z={}
@@ -4882,7 +5025,7 @@
 z={}
 y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.iS(z,y),!0,new P.qg(y),y.gaq())
+z.a=this.KR(new P.qg(z,y),!0,new P.yB(y),y.gaq())
 return y},
 grZ:function(a){var z,y
 z={}
@@ -4893,87 +5036,87 @@
 return y},
 $iscb:true},
 tG:{
-"^":"Xs;a,b,c,d",
+"^":"Tp;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.BE(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,79,"call"],
+P.FE(new P.BE(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,97,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 BE:{
-"^":"Xs:47;e,f",
+"^":"Tp:64;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
 Oh:{
-"^":"Xs:80;a,UI",
+"^":"Tp:98;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 kb:{
-"^":"Xs:47;bK",
+"^":"Tp:64;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
-"^":"Xs;a,b,c,d",
-$1:[function(a){P.FE(new P.at(this.c,a),new P.mj(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,79,"call"],
+"^":"Tp;a,b,c,d",
+$1:[function(a){P.FE(new P.at(this.c,a),new P.mj(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,97,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 at:{
-"^":"Xs:47;e,f",
+"^":"Tp:64;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 mj:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){},
 $isEH:true},
 ib:{
-"^":"Xs:47;UI",
+"^":"Tp:64;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ee:{
-"^":"Xs;a,b,c,d",
+Ia:{
+"^":"Tp;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,79,"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,97,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 WN:{
-"^":"Xs:47;e,f",
+"^":"Tp:64;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 XPB:{
-"^":"Xs:80;a,UI",
+"^":"Tp:98;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-Ia:{
-"^":"Xs:47;bK",
+BSd:{
+"^":"Tp:64;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uO:{
-"^":"Xs:30;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,81,"call"],
+"^":"Tp:10;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 hh:{
-"^":"Xs:47;a,b",
+"^":"Tp:64;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
-iS:{
-"^":"Xs:30;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
 qg:{
-"^":"Xs:47;c",
+"^":"Tp:10;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,11,"call"],
+$isEH:true},
+yB:{
+"^":"Tp:64;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
-"^":"Xs;a,b",
+"^":"Tp;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"$1",null,2,0,null,16,"call"],
+z.a=a},"$1",null,2,0,null,18,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 Z5:{
-"^":"Xs:47;a,c",
+"^":"Tp:64;a,c",
 $0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
@@ -4988,7 +5131,7 @@
 if((z.Gv&4)!==0)H.vh(P.w("Subscribing to closed stream"))
 y=$.X3
 x=a?1:0
-w=H.VM(new P.f6(null,null,null,z,null,null,null,y,x,null,null),[H.Kp(z,0)])
+w=H.VM(new P.LR(null,null,null,z,null,null,null,y,x,null,null),[H.Kp(z,0)])
 w.SJ=w
 w.iE=w
 x=z.SJ
@@ -5006,36 +5149,34 @@
 return b.Y8===this.Y8},
 $isO9:true},
 oh:{
-"^":"DR;Y8<",
+"^":"KA;Y8<",
 tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8()},"$0","gp4",0,0,13],
-LP:[function(){this.gY8()},"$0","gZ9",0,0,13]},
-oK:{
+uO:[function(){this.gY8()},"$0","gp4",0,0,15],
+LP:[function(){this.gY8()},"$0","gZ9",0,0,15]},
+NOT:{
 "^":"a;"},
-DR:{
-"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-yl:function(a){this.Lj.toString
-this.pN=a},
+KA:{
+"^":"a;pN,o7<,Bd,Lj<,Gv,lz,nb",
+yl:function(a){this.pN=this.Lj.wY(a)},
 fm:function(a,b){if(b==null)b=P.Mm()
 this.o7=P.VH(b,this.Lj)},
-y5:function(a){if(a==null)a=P.v3()
-this.Lj.toString
-this.Bd=a},
+y5:function(a){if(a==null)a=P.od()
+this.Bd=this.Lj.Al(a)},
 Fv:[function(a,b){var z,y
 z=this.Gv
 if((z&8)!==0)return
 this.Gv=(z+128|4)>>>0
 if(b!=null)b.wM(this.gDQ(this))
-if(z<128&&this.Ri!=null){y=this.Ri
-if(y.Gv===1)y.Gv=3}if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,82,18,83],
-ue:[function(a){var z=this.Gv
+if(z<128&&this.nb!=null){y=this.nb
+if(y.Gv===1)y.Gv=3}if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,99,20,100],
+zl:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.Gv=z
-if(z<128)if((z&64)!==0&&this.Ri.N6!=null)this.Ri.t2(this)
+if(z<128)if((z&64)!==0&&this.nb.N6!=null)this.nb.t2(this)
 else{z=(z&4294967291)>>>0
 this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}},"$0","gDQ",0,0,13],
+if((z&32)===0)this.J7(this.gZ9())}}},"$0","gDQ",0,0,15],
 ed:function(){var z=(this.Gv&4294967279)>>>0
 this.Gv=z
 if((z&8)!==0)return this.lz
@@ -5045,40 +5186,40 @@
 tk:function(){var z,y
 z=(this.Gv|8)>>>0
 this.Gv=z
-if((z&64)!==0){y=this.Ri
-if(y.Gv===1)y.Gv=3}if((z&32)===0)this.Ri=null
+if((z&64)!==0){y=this.nb
+if(y.Gv===1)y.Gv=3}if((z&32)===0)this.nb=null
 this.lz=this.tA()},
 Rg:function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.Iv(a)
 else this.VI(H.VM(new P.fZ(a,null),[null]))},
-V8:function(a,b){var z=this.Gv
+oJ:function(a,b){var z=this.Gv
 if((z&8)!==0)return
-if(z<32)this.NA(a,b)
+if(z<32)this.pb(a,b)
 else this.VI(new P.WG(a,b,null))},
 YB:function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
 if(z<32)this.Pl()
-else this.VI(C.Wj)},
-uO:[function(){},"$0","gp4",0,0,13],
-LP:[function(){},"$0","gZ9",0,0,13],
+else this.VI(C.ZB)},
+uO:[function(){},"$0","gp4",0,0,15],
+LP:[function(){},"$0","gZ9",0,0,15],
 tA:function(){},
 VI:function(a){var z,y
-z=this.Ri
-if(z==null){z=new P.ny(null,null,0)
-this.Ri=z}z.h(0,a)
+z=this.nb
+if(z==null){z=new P.qm(null,null,0)
+this.nb=z}z.h(0,a)
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
 this.Gv=y
-if(y<128)this.Ri.t2(this)}},
+if(y<128)this.nb.t2(this)}},
 Iv:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 this.Lj.M8(this.pN,a)
 this.Gv=(this.Gv&4294967263)>>>0
 this.Kl((z&4)!==0)},
-NA:function(a,b){var z,y
+pb:function(a,b){var z,y
 z=this.Gv
 y=new P.x1(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
@@ -5095,34 +5236,31 @@
 this.Kl((z&4)!==0)},
 Kl:function(a){var z,y,x
 z=this.Gv
-if((z&64)!==0&&this.Ri.N6==null){z=(z&4294967231)>>>0
+if((z&64)!==0&&this.nb.N6==null){z=(z&4294967231)>>>0
 this.Gv=z
-if((z&4)!==0)if(z<128){y=this.Ri
+if((z&4)!==0)if(z<128){y=this.nb
 y=y==null||y.N6==null}else y=!1
 else y=!1
 if(y){z=(z&4294967291)>>>0
-this.Gv=z}}for(;!0;a=x){if((z&8)!==0){this.Ri=null
+this.Gv=z}}for(;!0;a=x){if((z&8)!==0){this.nb=null
 return}x=(z&4)!==0
 if(a===x)break
 this.Gv=(z^32)>>>0
 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)},
+this.Gv=z}if((z&64)!==0&&z<128)this.nb.t2(this)},
 $isMO:true,
-static:{"^":"Xx,bG,nS,Ir,yJ,Dr,JAK,GC,Pj"}},
+static:{"^":"Xx,bG,nS,Ir,nav,Dr,JAK,N3S,bsZ"}},
 x1:{
-"^":"Xs:13;a,b,c",
+"^":"Tp:15;a,b,c",
 $0:function(){var z,y,x,w,v,u
 z=this.a
 y=z.Gv
 if((y&8)!==0&&(y&16)===0)return
 z.Gv=(y|32)>>>0
 y=z.Lj
-x=$.X3
-y.toString
-x.toString
-if(x==null?y!=null:x!==y)P.CK(x,null,x,this.b,this.c)
+if(!y.fC($.X3))$.X3.hk(this.b,this.c)
 else{x=z.o7
 w=H.G3()
 w=H.KT(w,[w,w]).BD(x)
@@ -5132,7 +5270,7 @@
 else y.M8(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
 qQ:{
-"^":"Xs:13;a",
+"^":"Tp:15;a",
 $0:function(){var z,y
 z=this.a
 y=z.Gv
@@ -5148,12 +5286,12 @@
 z.fm(0,d)
 z.y5(c)
 return z},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
 w4:function(a){var z,y
 z=$.X3
 y=a?1:0
-y=new P.DR(null,null,null,z,y,null,null)
+y=new P.KA(null,null,null,z,y,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y}},
 fIm:{
@@ -5163,7 +5301,7 @@
 dP:function(a){a.Iv(this.P)}},
 WG:{
 "^":"fIm;kc>,I4<,aw",
-dP:function(a){a.NA(this.kc,this.I4)}},
+dP:function(a){a.pb(this.kc,this.I4)}},
 JF:{
 "^":"a;",
 dP:function(a){a.Pl()},
@@ -5177,7 +5315,7 @@
 return}P.rb(new P.Vd(this,a))
 this.Gv=1}},
 Vd:{
-"^":"Xs:47;a,b",
+"^":"Tp:64;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -5185,7 +5323,7 @@
 if(y===3)return
 z.TO(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
-ny:{
+qm:{
 "^":"r5;zR,N6,Gv",
 gl0:function(a){return this.N6==null},
 h:function(a,b){var z=this.N6
@@ -5202,15 +5340,15 @@
 this.N6=null
 this.zR=null}},
 dR:{
-"^":"Xs:47;a,b,c",
+"^":"Tp:64;a,b,c",
 $0:function(){return this.a.K5(this.b,this.c)},
 $isEH:true},
 uR:{
-"^":"Xs:84;a,b",
+"^":"Tp:101;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 Q0:{
-"^":"Xs:47;a,b",
+"^":"Tp:64;a,b",
 $0:function(){return this.a.rX(this.b)},
 $isEH:true},
 og:{
@@ -5222,7 +5360,7 @@
 x=$.X3
 w=b?1:0
 v=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
-v.nb(this,b,z,y)
+v.Ri(this,b,z,y)
 v.yl(a)
 v.fm(0,d)
 v.y5(c)
@@ -5232,28 +5370,28 @@
 ut:function(a,b){b.Rg(a)},
 $ascb:function(a,b){return[b]}},
 fB:{
-"^":"DR;UY,WS,pN,o7,Bd,Lj,Gv,lz,Ri",
+"^":"KA;UY,WS,pN,o7,Bd,Lj,Gv,lz,nb",
 Rg:function(a){if((this.Gv&2)!==0)return
-P.DR.prototype.Rg.call(this,a)},
-V8:function(a,b){if((this.Gv&2)!==0)return
-P.DR.prototype.V8.call(this,a,b)},
+P.KA.prototype.Rg.call(this,a)},
+oJ:function(a,b){if((this.Gv&2)!==0)return
+P.KA.prototype.oJ.call(this,a,b)},
 uO:[function(){var z=this.WS
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,13],
+z.yy(0)},"$0","gp4",0,0,15],
 LP:[function(){var z=this.WS
 if(z==null)return
-z.ue(0)},"$0","gZ9",0,0,13],
+z.zl(0)},"$0","gZ9",0,0,15],
 tA:function(){var z=this.WS
 if(z!=null){this.WS=null
 z.ed()}return},
-vx:[function(a){this.UY.ut(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"wa",void:true,args:[a]}},this.$receiver,"fB")},73],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,85,19,20],
-fE:[function(){this.YB()},"$0","gH1",0,0,13],
-nb:function(a,b,c,d){var z,y
+vx:[function(a){this.UY.ut(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"wa",void:true,args:[a]}},this.$receiver,"fB")},90],
+xL:[function(a,b){this.oJ(a,b)},"$2","gRE",4,0,102,21,22],
+fE:[function(){this.YB()},"$0","gH1",0,0,15],
+Ri:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
 this.WS=this.UY.Sb.zC(z,this.gH1(),y)},
-$asDR:function(a,b){return[b]},
+$asKA:function(a,b){return[b]},
 $asMO:function(a,b){return[b]}},
 nO:{
 "^":"og;qs,Sb",
@@ -5262,8 +5400,8 @@
 z=null
 try{z=this.wW(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-b.V8(y,x)
+x=new H.XO(w,null)
+b.oJ(y,x)
 return}if(z===!0)b.Rg(a)},
 $asog:function(a){return[a,a]},
 $ascb:null},
@@ -5274,8 +5412,8 @@
 z=null
 try{z=this.kn(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-b.V8(y,x)
+x=new H.XO(w,null)
+b.oJ(y,x)
 return}b.Rg(z)}},
 Bg:{
 "^":"og;pK,Sb",
@@ -5284,80 +5422,204 @@
 try{for(w=J.mY(this.GW(a));w.G();){z=w.gl()
 b.Rg(z)}}catch(v){w=H.Ru(v)
 y=w
-x=new H.oP(v,null)
-b.V8(y,x)}}},
-fZi:{
+x=new H.XO(v,null)
+b.oJ(y,x)}}},
+Xa:{
+"^":"a;"},
+aY:{
+"^":"a;"},
+yQ:{
+"^":"a;E2<,cP<,Ot<,eo<,Ka<,Xp<,fb<,rb<,Zq<,NW,mp>,il<",
+hk:function(a,b){return this.E2.$2(a,b)},
+Gr:function(a){return this.cP.$1(a)},
+FI:function(a,b){return this.Ot.$2(a,b)},
+mg:function(a,b,c){return this.eo.$3(a,b,c)},
+Al:function(a){return this.Ka.$1(a)},
+wY:function(a){return this.Xp.$1(a)},
+O8:function(a){return this.fb.$1(a)},
+wr:function(a){return this.rb.$1(a)},
+RK:function(a,b){return this.rb.$2(a,b)},
+uN:function(a,b){return this.Zq.$2(a,b)},
+Ch:function(a,b){return this.mp.$1(b)},
+qp:function(a){return this.il.$1$specification(a)}},
+qK:{
+"^":"a;"},
+xp:{
+"^":"a;"},
+Id:{
+"^":"a;nU",
+gLj:function(){return this.nU},
+x5:function(a,b,c){var z=this.nU
+for(;z.gtp().gE2()==null;)z=z.geT(z)
+return z.gtp().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
+Vn:function(a,b){var z=this.nU
+for(;z.gtp().gcP()==null;)z=z.geT(z)
+return z.gtp().gcP().$4(z,new P.Id(z.geT(z)),a,b)},
+qG:function(a,b,c){var z=this.nU
+for(;z.gtp().gOt()==null;)z=z.geT(z)
+return z.gtp().gOt().$5(z,new P.Id(z.geT(z)),a,b,c)},
+nA:function(a,b,c,d){var z=this.nU
+for(;z.gtp().geo()==null;)z=z.geT(z)
+return z.gtp().geo().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
+TE:function(a,b){var z=this.nU
+for(;z.gtp().gKa()==null;)z=z.geT(z)
+return z.gtp().gKa().$4(z,new P.Id(z.geT(z)),a,b)},
+xO:function(a,b){var z=this.nU
+for(;z.gtp().gXp()==null;)z=z.geT(z)
+return z.gtp().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
+mz:function(a,b){var z=this.nU
+for(;z.gtp().gfb()==null;)z=z.geT(z)
+return z.gtp().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
+RK:function(a,b){var z,y
+z=this.nU
+for(;z.gtp().grb()==null;)z=z.geT(z)
+y=z.geT(z)
+z.gtp().grb().$4(z,new P.Id(y),a,b)},
+dJ:function(a,b,c){var z=this.nU
+for(;z.gtp().gZq()==null;)z=z.geT(z)
+return z.gtp().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
+RB:function(a,b,c){var z,y
+z=this.nU
+for(;y=z.gtp(),y.gmp(y)==null;)z=z.geT(z)
+y=z.gtp()
+y.gmp(y).$4(z,new P.Id(z.geT(z)),b,c)},
+ld:function(a,b,c){var z,y
+z=this.nU
+for(;z.gtp().gil()==null;)z=z.geT(z)
+y=z.geT(z)
+return z.gtp().gil().$5(z,new P.Id(y),a,b,c)}},
+ld:{
 "^":"a;",
+fC:function(a){return this.gC5()===a.gC5()},
 bH:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
 M8:function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
 z8:function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
 xi:function(a,b){var z=this.Al(a)
 if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},
+else return new P.Xz(this,z)},
 ce:function(a){return this.xi(a,!0)},
 Nf:function(a,b){var z=this.wY(a)
 if(b)return new P.Cg(this,z)
 else return new P.Hs(this,z)}},
 TF:{
-"^":"Xs:47;a,b",
+"^":"Tp:64;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
-K5:{
-"^":"Xs:47;c,d",
+Xz:{
+"^":"Tp:64;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Xs:30;a,b",
-$1:[function(a){return this.a.M8(this.b,a)},"$1",null,2,0,null,86,"call"],
+"^":"Tp:10;a,b",
+$1:[function(a){return this.a.M8(this.b,a)},"$1",null,2,0,null,30,"call"],
 $isEH:true},
 Hs:{
-"^":"Xs:30;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,86,"call"],
+"^":"Tp:10;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,30,"call"],
 $isEH:true},
+uo:{
+"^":"ld;eT>,tp<,Se",
+gC5:function(){return this.eT.gC5()},
+t:function(a,b){var z,y
+z=this.Se
+y=z.t(0,b)
+if(y!=null||z.x4(b))return y
+return this.eT.t(0,b)},
+hk:function(a,b){return new P.Id(this).x5(this,a,b)},
+uI:function(a,b){return new P.Id(this).ld(this,a,b)},
+qp:function(a){return this.uI(a,null)},
+Gr:function(a){return new P.Id(this).Vn(this,a)},
+FI:function(a,b){return new P.Id(this).qG(this,a,b)},
+mg:function(a,b,c){return new P.Id(this).nA(this,a,b,c)},
+Al:function(a){return new P.Id(this).TE(this,a)},
+wY:function(a){return new P.Id(this).xO(this,a)},
+O8:function(a){return new P.Id(this).mz(this,a)},
+wr:function(a){new P.Id(this).RK(this,a)},
+uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
+Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
 FO:{
-"^":"Xs:47;a,b",
-$0:function(){P.IA(new P.eM(this.a,this.b))},
+"^":"Tp:64;a,b",
+$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Xs:47;c,d",
+"^":"Tp:64;c,d",
 $0:[function(){var z,y
 z=this.c
-P.mp("Uncaught Error: "+H.d(z))
+P.FL("Uncaught Error: "+H.d(z))
 y=this.d
 if(y==null&&!!J.x(z).$isXS)y=z.gI4()
-if(y!=null)P.mp("Stack Trace: \n"+H.d(y)+"\n")
+if(y!=null)P.FL("Stack Trace: \n"+H.d(y)+"\n")
 throw H.b(z)},"$0",null,0,0,null,"call"],
 $isEH:true},
+Uez:{
+"^":"Tp:67;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,68,18,"call"],
+$isEH:true},
+AH:{
+"^":"a;",
+gE2:function(){return P.wL()},
+hk:function(a,b){return this.gE2().$2(a,b)},
+gcP:function(){return P.lw()},
+Gr:function(a){return this.gcP().$1(a)},
+gOt:function(){return P.MM()},
+FI:function(a,b){return this.gOt().$2(a,b)},
+geo:function(){return P.iy()},
+mg:function(a,b,c){return this.geo().$3(a,b,c)},
+gKa:function(){return P.Qk()},
+Al:function(a){return this.gKa().$1(a)},
+gXp:function(){return P.zi()},
+wY:function(a){return this.gXp().$1(a)},
+gfb:function(){return P.v3()},
+O8:function(a){return this.gfb().$1(a)},
+grb:function(){return P.G2()},
+wr:function(a){return this.grb().$1(a)},
+RK:function(a,b){return this.grb().$2(a,b)},
+gZq:function(){return P.KF()},
+uN:function(a,b){return this.gZq().$2(a,b)},
+gmp:function(a){return P.aW()},
+Ch:function(a,b){return this.gmp(this).$1(b)},
+gil:function(){return P.Is()},
+qp:function(a){return this.gil().$1$specification(a)}},
 R81:{
-"^":"fZi;",
+"^":"ld;",
 geT:function(a){return},
+gtp:function(){return C.v8},
+gC5:function(){return this},
+fC:function(a){return a.gC5()===this},
 t:function(a,b){return},
 hk:function(a,b){return P.CK(this,null,this,a,b)},
+uI:function(a,b){return P.UA(this,null,this,a,b)},
+qp:function(a){return this.uI(a,null)},
 Gr:function(a){return P.T8(this,null,this,a)},
 FI:function(a,b){return P.V7(this,null,this,a,b)},
 mg:function(a,b,c){return P.Mu(this,null,this,a,b,c)},
 Al:function(a){return a},
-wY:function(a){return a}}}],["dart.collection","dart:collection",,P,{
+wY:function(a){return a},
+O8:function(a){return a},
+wr:function(a){P.Tk(this,null,this,a)},
+uN:function(a,b){return P.h8(this,null,this,a,b)},
+Ch:function(a,b){H.qw(b)
+return}}}],["dart.collection","dart:collection",,P,{
 "^":"",
 EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-Ou:[function(a,b){return J.xC(a,b)},"$2","bd",4,0,21,22,23],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,24,22],
+R2:[function(a,b){return J.xC(a,b)},"$2","lZ",4,0,42,43,44],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,45,43],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -5366,15 +5628,21 @@
 RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
 op:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
 yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
-m4:function(a,b,c){var z,y
-if($.xb().tg(0,a))return b+"..."+c
-$.xb().h(0,a)
-z=[]
-try{P.eG(a,z)}finally{$.xb().Rz(0,a)}y=P.p9(b)
+Ix:function(a,b,c){var z,y
+if($.Ex().tg(0,a)){if(b==="("&&c===")")return"(...)"
+return b+"..."+c}z=[]
+$.Ex().h(0,a)
+try{P.T4(a,z)}finally{$.Ex().Rz(0,a)}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
 return y.vM},
-eG:function(a,b){var z,y,x,w,v,u,t,s,r,q
+WE:function(a,b,c){var z
+if($.Ex().tg(0,a))return b+"..."+c
+z=P.p9(b)
+$.Ex().h(0,a)
+try{z.We(a,", ")}finally{$.Ex().Rz(0,a)}z.KF(c)
+return z.gvM()},
+T4:function(a,b){var z,y,x,w,v,u,t,s,r,q
 z=a.gA(a)
 y=0
 x=0
@@ -5526,11 +5794,11 @@
 delete z["<non-identifier-key>"]
 return z}}},
 oi:{
-"^":"Xs:30;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,87,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,103,"call"],
 $isEH:true},
 DJ:{
-"^":"Xs;a",
+"^":"Tp;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
@@ -5564,7 +5832,7 @@
 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:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -5713,11 +5981,11 @@
 delete z["<non-identifier-key>"]
 return z}}},
 a1:{
-"^":"Xs:30;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,87,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,103,"call"],
 $isEH:true},
 pk:{
-"^":"Xs;a",
+"^":"Tp;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
@@ -5753,7 +6021,7 @@
 this.zq=this.zq.gDG()
 return!0}}}},
 jg:{
-"^":"u3T;X5,vv,OX,OB,DM",
+"^":"lN;X5,vv,OX,OB,DM",
 gA:function(a){var z=new P.oz(this,this.Zl(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
@@ -5853,8 +6121,8 @@
 for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{jB:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
@@ -5880,7 +6148,7 @@
 this.zi=y+1
 return!0}}},
 D0:{
-"^":"u3T;X5,vv,OX,OB,H9,lX,zN",
+"^":"lN;X5,vv,OX,OB,H9,lX,zN",
 gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
@@ -5989,8 +6257,8 @@
 for(y=0;y<z;++y)if(J.xC(a[y].gGc(),b))return y
 return-1},
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{T2:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
@@ -6008,19 +6276,18 @@
 this.zq=this.zq.gDG()
 return!0}}}},
 Yp:{
-"^":"XC;G4",
+"^":"w2Y;G4",
 gB:function(a){return this.G4.length},
 t:function(a,b){var z=this.G4
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]}},
-u3T:{
-"^":"Vj;",
-bu:function(a){return P.m4(this,"{","}")}},
+lN:{
+"^":"Vj;"},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"Uy",ret:P.cX,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},46],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"Uy",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},28],
 ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.cX,args:[{func:"tr",ret:P.cX,args:[a]}]}},this.$receiver,"mW")},46],
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},28],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -6059,16 +6326,18 @@
 w=J.x(y)
 if(w.n(y,0))return x
 y=w.W(y,1)}throw H.b(P.N(b))},
-bu:function(a){return P.m4(this,"(",")")},
-$iscX:true,
-$ascX:null},
+bu:function(a){return P.Ix(this,"(",")")},
+$isQV:true,
+$asQV:null},
 rm:{
+"^":"eD;"},
+eD:{
 "^":"a+lD;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
@@ -6095,8 +6364,8 @@
 z.We(a,b)
 return z.vM},
 ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"uY",ret:P.cX,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},46],
-Ft:[function(a,b){return H.VM(new H.zs(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.cX,args:[{func:"VL",ret:P.cX,args:[a]}]}},this.$receiver,"lD")},46],
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},28],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},28],
 eR:function(a,b){return H.j5(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -6153,7 +6422,7 @@
 for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
 return-1},
 cn:function(a,b){return this.Pk(a,b,null)},
-aP:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
+xe:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,this.gB(a)+1)
 this.YW(a,b+1,this.gB(a),a,b)
@@ -6165,26 +6434,20 @@
 y=J.q8(c)
 this.sB(a,this.gB(a)+y)
 this.YW(a,b+y,this.gB(a),a,b)
-this.Mh(a,b,c)},
-Mh:function(a,b,c){var z,y
+this.Yj(a,b,c)},
+Yj:function(a,b,c){var z,y
 z=J.x(c)
 if(!!z.$isWO)this.vg(a,b,b+z.gB(c),c)
 else for(z=z.gA(c);z.G();b=y){y=b+1
 this.u(a,b,z.gl())}},
-bu:function(a){var z
-if($.xb().tg(0,a))return"[...]"
-z=P.p9("")
-try{$.xb().h(0,a)
-z.KF("[")
-z.We(a,", ")
-z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
+bu:function(a){return P.WE(a,"[","]")},
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 W0:{
-"^":"Xs:50;a,b",
+"^":"Tp:67;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
@@ -6209,7 +6472,7 @@
 grZ:function(a){var z,y,x
 z=this.av
 y=this.eZ
-if(z===y)throw H.b(P.w("No elements"))
+if(z===y)throw H.b(H.DU())
 z=this.v5
 x=z.length
 y=(y-1&x-1)>>>0
@@ -6252,10 +6515,10 @@
 if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
 x[z]=null}this.eZ=0
 this.av=0;++this.qT}},
-bu:function(a){return P.m4(this,"{","}")},
+bu:function(a){return P.WE(this,"{","}")},
 AR:function(){var z,y,x,w
 z=this.av
-if(z===this.eZ)throw H.b(P.w("No elements"));++this.qT
+if(z===this.eZ)throw H.b(H.DU());++this.qT
 y=this.v5
 x=y.length
 if(z>=x)return H.e(y,z)
@@ -6302,8 +6565,8 @@
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{"^":"TN",Pd:function(a){var z
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
@@ -6323,7 +6586,7 @@
 this.fD=z[y]
 this.Dc=(y+1&x-1)>>>0
 return!0}},
-lf:{
+lfu:{
 "^":"a;",
 gl0:function(a){return this.gB(this)===0},
 gor:function(a){return this.gB(this)!==0},
@@ -6333,18 +6596,20 @@
 Ex:function(a){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)this.Rz(0,z.lo)},
 tt:function(a,b){var z,y,x,w,v
-if(b){z=H.VM([],[H.ip(this,"lf",0)])
+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.ip(this,"lf",0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
+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},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.ip(this,"lf",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQO",ret:P.cX,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lf")},46],
-bu:function(a){return P.m4(this,"{","}")},
-ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"lf",0)])},
-Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"lf",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.cX,args:[{func:"D6",ret:P.cX,args:[a]}]}},this.$receiver,"lf")},46],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Kp(this,0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lfu")},28],
+bu:function(a){return P.WE(this,"{","}")},
+ev:function(a,b){var z=new H.U5(this,b)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z},
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.Kp(this,0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"D6",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},28],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
@@ -6367,20 +6632,17 @@
 while(z.G())
 return y},
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 Vj:{
-"^":"a+lf;",
-$isyN:true,
-$iscX:true,
-$ascX:null},
+"^":"lfu;"},
 qv:{
 "^":"a;G3>,Bb>,T8>",
 $isqv:true},
 jp:{
 "^":"qv;P*,G3,Bb,T8",
 $asqv:function(a,b){return[a]}},
-Xt:{
+vX1:{
 "^":"a;",
 vh:function(a){var z,y,x,w,v,u,t,s
 z=this.aY
@@ -6391,7 +6653,7 @@
 if(u.D(v,0)){u=z.Bb
 if(u==null)break
 v=this.yV(u.G3,a)
-if(J.xZ(v,0)){t=z.Bb
+if(J.z8(v,0)){t=z.Bb
 z.Bb=t.T8
 t.T8=z
 if(t.Bb==null){z=t
@@ -6416,7 +6678,7 @@
 y.T8=null
 y.Bb=null;++this.bb
 return v},
-K8:function(a,b){var z,y;++this.P6;++this.qT
+K8:function(a,b){var z,y;++this.J0;++this.qT
 if(this.aY==null){this.aY=a
 return}z=J.u6(b,0)
 y=this.aY
@@ -6426,7 +6688,7 @@
 a.Bb=y.Bb
 y.Bb=null}this.aY=a}},
 Ba:{
-"^":"Xt;Cw,hg,aY,iW,P6,qT,bb",
+"^":"vX1;Cw,hg,aY,iW,J0,qT,bb",
 wS:function(a,b){return this.Cw.$2(a,b)},
 Ef:function(a){return this.hg.$1(a)},
 yV:function(a,b){return this.wS(a,b)},
@@ -6449,16 +6711,16 @@
 for(;y.G();){x=y.gl()
 z=J.RE(x)
 b.$2(z.gG3(x),z.gP(x))}},
-gB:function(a){return this.P6},
+gB:function(a){return this.J0},
 V1:function(a){this.aY=null
-this.P6=0;++this.qT},
+this.J0=0;++this.qT},
 gvc:function(){return H.VM(new P.nF(this),[H.Kp(this,0)])},
 gUQ:function(a){var z=new P.ro(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 bu:function(a){return P.vW(this)},
 $isBa:true,
-$asXt:function(a,b){return[a]},
+$asvX1:function(a,b){return[a]},
 $asZ0:null,
 $isZ0:true,
 static:{GV:function(a,b,c,d){var z,y
@@ -6466,12 +6728,12 @@
 y=new P.An(c)
 return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
 QG:{
-"^":"Xs;a",
+"^":"Tp;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
@@ -6500,8 +6762,8 @@
 Qf:function(a,b){this.Az(a.aY)}},
 nF:{
 "^":"mW;lT",
-gB:function(a){return this.lT.P6},
-gl0:function(a){return this.lT.P6===0},
+gB:function(a){return this.lT.J0},
+gl0:function(a){return this.lT.J0===0},
 gA:function(a){var z,y
 z=this.lT
 y=new P.DN(z,H.VM([],[P.qv]),z.qT,z.bb,null)
@@ -6511,8 +6773,8 @@
 $isyN:true},
 ro:{
 "^":"mW;Fb",
-gB:function(a){return this.Fb.P6},
-gl0:function(a){return this.Fb.P6===0},
+gB:function(a){return this.Fb.J0},
+gl0:function(a){return this.Fb.J0===0},
 gA:function(a){var z,y
 z=this.Fb
 y=new P.ZM(z,H.VM([],[P.qv]),z.qT,z.bb,null)
@@ -6520,7 +6782,7 @@
 y.Qf(z,H.Kp(this,1))
 return y},
 $asmW:function(a,b){return[b]},
-$ascX:function(a,b){return[b]},
+$asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
 "^":"S6B;lT,Jt,qT,bb,ya",
@@ -6534,7 +6796,7 @@
 Wb:function(a){return a},
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
-Uw:function(a,b){var z=b==null?new P.JC():b
+Uw:function(a,b){var z=b==null?new P.hW():b
 return z.$2(null,new P.f1(z).$1(a))},
 jc:function(a,b){var z,y,x,w
 x=a
@@ -6543,13 +6805,13 @@
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
 throw H.b(P.cD(String(y)))}return P.Uw(z,b)},
-tp:[function(a){return a.Bu()},"$1","Mn",2,0,25,26],
-JC:{
-"^":"Xs:50;",
+NC:[function(a){return a.Lt()},"$1","bx",2,0,46,47],
+hW:{
+"^":"Tp:67;",
 $2:function(a,b){return b},
 $isEH:true},
 f1:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
@@ -6581,26 +6843,26 @@
 "^":"Wf;qa<,fO",
 pW:function(a,b){return P.jc(a,this.gHe().qa)},
 kV:function(a){return this.pW(a,null)},
-Q0:function(a,b){var z=this.gZE()
+Co:function(a,b){var z=this.gZE()
 return P.Vg(a,z.Xn,z.UM)},
-KP:function(a){return this.Q0(a,null)},
+KP:function(a){return this.Co(a,null)},
 gZE:function(){return C.Sr},
 gHe:function(){return C.A3},
 $asWf:function(){return[P.a,P.qU]}},
-dI:{
+ze:{
 "^":"zF;UM,Xn",
 $aszF:function(){return[P.a,P.qU]}},
 Cf:{
 "^":"zF;qa<",
 $aszF:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;fO,cP,ol",
+"^":"a;fO,p8,ol",
 iY:function(a){return this.fO.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
 if(typeof y!=="number")return H.s(y)
-x=this.cP
+x=this.p8
 w=0
 v=0
 for(;v<y;++v){u=z.j(a,v)
@@ -6658,24 +6920,24 @@
 throw H.b(P.Gy(a,y))}}},
 IS:function(a){var z,y,x,w,v,u
 if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.cP.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.cP.KF("true")
-return!0}else if(a===!1){this.cP.KF("false")
-return!0}else if(a==null){this.cP.KF("null")
-return!0}else if(typeof a==="string"){z=this.cP
+this.p8.KF(C.CD.bu(a))
+return!0}else if(a===!0){this.p8.KF("true")
+return!0}else if(a===!1){this.p8.KF("false")
+return!0}else if(a==null){this.p8.KF("null")
+return!0}else if(typeof a==="string"){z=this.p8
 z.KF("\"")
 this.Ip(a)
 z.KF("\"")
 return!0}else{z=J.x(a)
 if(!!z.$isWO){this.WD(a)
-y=this.cP
+y=this.p8
 y.KF("[")
 if(z.gB(a)>0){this.C7(z.t(a,0))
 for(x=1;x<z.gB(a);++x){y.vM+=","
 this.C7(z.t(a,x))}}y.KF("]")
 this.pg(a)
 return!0}else if(!!z.$isZ0){this.WD(a)
-y=this.cP
+y=this.p8
 y.KF("{")
 for(w=J.mY(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
 y.vM+=v
@@ -6687,13 +6949,13 @@
 pg:function(a){var z=this.ol
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"P3,hyY,IE,Jyf,NoV,fg,Wk,WF,E7,MU,vk,NXu,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
-b=P.Mn()
+static:{"^":"P3,hyY,IE,Jyf,NoV,fg,Wk,pe,E7,MU,vk,NXu,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+b=P.bx()
 z=P.p9("")
 P.uI(z,b,c).C7(a)
 return z.vM}}},
-Fd:{
-"^":"Ziv;IE",
+u5F:{
+"^":"Ziv;Iy",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
@@ -6703,11 +6965,11 @@
 y=J.vX(z.gB(a),3)
 if(typeof y!=="number")return H.s(y)
 y=H.VM(Array(y),[P.KN])
-x=new P.Rw(0,0,y)
-if(x.rw(a,0,z.gB(a))!==z.gB(a))x.GT(z.j(a,J.xH(z.gB(a),1)),0)
+x=new P.Yu(0,0,y)
+if(x.rw(a,0,z.gB(a))!==z.gB(a))x.GT(z.j(a,J.Hn(z.gB(a),1)),0)
 return C.Nm.aM(y,0,x.L8)},
 $aszF:function(){return[P.qU,[P.WO,P.KN]]}},
-Rw:{
+Yu:{
 "^":"a;So,L8,IT",
 GT:function(a,b){var z,y,x,w,v
 z=this.IT
@@ -6743,7 +7005,7 @@
 z[y]=128|a&63
 return!1}},
 rw:function(a,b,c){var z,y,x,w,v,u,t,s
-if(b!==c&&(J.FW(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
+if(b!==c&&(J.FW(a,J.Hn(c,1))&64512)===55296)c=J.Hn(c,1)
 if(typeof c!=="number")return H.s(c)
 z=this.IT
 y=z.length
@@ -6775,10 +7037,10 @@
 this.L8=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
-static:{"^":"Jf"}}}],["dart.core","dart:core",,P,{
+static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
 "^":"",
 Te:function(a){return},
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,27,22,23],
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,48,43,44],
 hl:function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -6798,16 +7060,19 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,28],
-QP:[function(a){return H.CU(a)},"$1","V4",2,0,29],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,49],
+QP:[function(a){return H.CU(a)},"$1","V4",2,0,50],
 F:function(a,b,c){var z,y
 z=H.VM([],[c])
 for(y=J.mY(a);y.G();)z.push(y.gl())
 if(b)return z
 z.fixed$length=init
 return z},
-mp:function(a){var z=H.d(a)
-H.qw(z)},
+FL:function(a){var z,y
+z=H.d(a)
+y=$.oK
+if(y==null)H.qw(z)
+else y.$1(z)},
 jW:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
@@ -6823,11 +7088,11 @@
 y.vM+=u
 z.$2(v,y)}}return y.vM},
 Y25:{
-"^":"Xs:50;a",
+"^":"Tp:67;a",
 $2:function(a,b){this.a.u(0,a.gfN(),b)},
 $isEH:true},
 CL:{
-"^":"Xs:88;a",
+"^":"Tp:104;a",
 $2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(a.gfN())
@@ -6838,7 +7103,7 @@
 "^":"a;",
 $isa2:true},
 "+bool":0,
-Ij:{
+Rz:{
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
@@ -6855,14 +7120,14 @@
 v=P.h0(z?H.o2(this).getUTCHours()+0:H.o2(this).getHours()+0)
 u=P.h0(z?H.o2(this).getUTCMinutes()+0:H.o2(this).getMinutes()+0)
 t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
-s=P.Vx(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
+s=P.pV(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
 else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},
 h:function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"bS,Vp,Hq,Kw,ch,mo,EQe,Qg,H9,Gio,Fz,cRS,E03,KeL,Ne,NrX,Dk,o4I,T3F,PW,TO,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"bS,Vp8,Eu,Kw,h2,mo,EQe,Qg,tp1,Xs,Fz,LC,E03,KeL,Ne,NrX,Dk,o4I,hZ,PW,TO,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.ol("^([+-]?\\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
@@ -6892,9 +7157,9 @@
 if(11>=x.length)return H.e(x,11)
 l=y.$1(x[11])
 if(typeof m!=="number")return H.s(m)
-l=J.WB(l,60*m)
+l=J.ew(l,60*m)
 if(typeof l!=="number")return H.s(l)
-s=J.xH(s,n*l)}k=!0}else k=!1
+s=J.Hn(s,n*l)}k=!0}else k=!1
 j=H.fu(w,v,u,t,s,r,q,k)
 return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
@@ -6904,17 +7169,17 @@
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},Vx:function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},pV:function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 MF:{
-"^":"Xs:89;",
+"^":"Tp:105;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Xs:90;",
+"^":"Tp:106;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -6950,9 +7215,9 @@
 v=new P.P7().$1(C.CD.JV(y,1000000))
 return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"YN,v7,dko,LoB,RD,b2H,q9,ll,DoM,CvD,MV,IJZ,iI,Wr,Nw,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"YN,v7,dko,LoB,RD,b2H,q9,ll,DoM,CvD,MV,IJZ,D9,Wr,Nw,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Xs:10;",
+"^":"Tp:12;",
 $1:function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
@@ -6961,13 +7226,13 @@
 return"00000"+H.d(a)},
 $isEH:true},
 wr:{
-"^":"Xs:10;",
+"^":"Tp:12;",
 $1:function(a){if(a>=10)return H.d(a)
 return"0"+H.d(a)},
 $isEH:true},
 XS:{
 "^":"a;",
-gI4:function(){return new H.oP(this.$thrownJsError,null)},
+gI4:function(){return new H.XO(this.$thrownJsError,null)},
 $isXS:true},
 LK:{
 "^":"XS;",
@@ -6981,11 +7246,11 @@
 Sn:{
 "^":"AT;G1",
 bu:function(a){return"RangeError: "+H.d(this.G1)},
-static:{C3:function(a){return new P.Sn(a)},N:function(a){return new P.Sn("value "+H.d(a))},TE:function(a,b,c){return new P.Sn("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
+static:{KP:function(a){return new P.Sn(a)},N:function(a){return new P.Sn("value "+H.d(a))},TE:function(a,b,c){return new P.Sn("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
 Np:{
 "^":"XS;",
 static:{a9:function(){return new P.Np()}}},
-MC:{
+JS:{
 "^":"XS;uF,UP,mP,SA,vG",
 bu:function(a){var z,y,x,w,v,u
 z={}
@@ -6997,18 +7262,18 @@
 u=P.hl(y[x])
 v.vM+=typeof u==="string"?u:H.d(u)}this.SA.aN(0,new P.CL(z))
 return"NoSuchMethodError : method not found: '"+this.UP.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},
-$isMC:true,
-static:{lr:function(a,b,c,d,e){return new P.MC(a,b,c,d,e)}}},
+$isJS:true,
+static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
 "^":"XS;G1>",
 bu:function(a){return"Unsupported operation: "+this.G1},
 static:{f:function(a){return new P.ub(a)}}},
-ds:{
+rM:{
 "^":"XS;G1>",
 bu:function(a){var z=this.G1
 return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},
 $isXS:true,
-static:{SY:function(a){return new P.ds(a)}}},
+static:{SY:function(a){return new P.rM(a)}}},
 lj:{
 "^":"XS;G1>",
 bu:function(a){return"Bad state: "+this.G1},
@@ -7019,7 +7284,7 @@
 if(z==null)return"Concurrent modification during iteration."
 return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},
 static:{a4:function(a){return new P.UV(a)}}},
-vG:{
+qn:{
 "^":"a;",
 bu:function(a){return"Out of Memory"},
 gI4:function(){return},
@@ -7038,10 +7303,10 @@
 bu:function(a){var z=this.G1
 if(z==null)return"Exception"
 return"Exception: "+H.d(z)}},
-aE:{
+oe:{
 "^":"a;G1>",
 bu:function(a){return"FormatException: "+H.d(this.G1)},
-static:{cD:function(a){return new P.aE(a)}}},
+static:{cD:function(a){return new P.oe(a)}}},
 eV:{
 "^":"a;",
 bu:function(a){return"IntegerDivisionByZeroException"},
@@ -7053,13 +7318,13 @@
 return z==null?null:H.of(z,this.Qz())},
 u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.wV(b,"expando$values",z)}H.wV(z,this.Qz(),c)},
+H.R0(b,"expando$values",z)}H.R0(z,this.Qz(),c)},
 Qz:function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
 $.Ss=y+1
 z="expando$key$"+y
-H.wV(this,"expando$key",z)}return z},
+H.R0(this,"expando$key",z)}return z},
 static:{"^":"bZT,rly,Ss"}},
 EH:{
 "^":"a;",
@@ -7068,19 +7333,19 @@
 "^":"FK;",
 $isKN:true},
 "+int":0,
-cX:{
+QV:{
 "^":"a;",
-$iscX:true,
-$ascX:null},
-AC:{
+$isQV:true,
+$asQV:null},
+Yl:{
 "^":"a;"},
 WO:{
 "^":"a;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 "+List":0,
 Z0:{
 "^":"a;",
@@ -7111,10 +7376,10 @@
 $isqU:true},
 "+String":0,
 WU:{
-"^":"a;Cb,R7,C3,Wn",
+"^":"a;Cb,R7,Oq,Wn",
 gl:function(){return this.Wn},
 G:function(){var z,y,x,w,v,u
-z=this.C3
+z=this.Oq
 this.R7=z
 y=this.Cb
 x=y.length
@@ -7122,9 +7387,9 @@
 return!1}w=C.xB.j(y,z)
 v=this.R7+1
 if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
-if((u&64512)===56320){this.C3=v+1
+if((u&64512)===56320){this.Oq=v+1
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.C3=v
+return!0}}this.Oq=v
 this.Wn=w
 return!0}},
 Rn:{
@@ -7156,23 +7421,23 @@
 "^":"a;",
 $isuq:true},
 rI:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 r3:function(a,b){return document.createElement(a)},
-It:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+It:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.KxY())},
 lt:function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.fJ
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
-C.W3.eo(x,"GET",a,!0)
+C.W3.kP(x,"GET",a,!0)
 z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
 H.VM(new W.fd(0,z.bi,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
 z=H.VM(new W.RO(x,C.MD.Ph,!1),[null])
-H.VM(new W.fd(0,z.bi,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(y.gXN()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
 return y.MM},
 ED:function(a){var z,y
@@ -7188,34 +7453,33 @@
 if("setInterval" in a){z=W.P1(a)
 if(!!J.x(z).$isPZ)return z
 return}else return a},
-m7:function(a){return a},
+ju:function(a){return a},
 Z9:function(a){if(!!J.x(a).$isQF)return a
 return P.o7(a,!0)},
-Rl:function(a,b){return new W.vZ(a,b)},
-w6:[function(a){return J.N1(a)},"$1","B4",2,0,30,31],
-Hx:[function(a){return J.vr(a)},"$1","Z6",2,0,30,31],
-Qp:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","A6",8,0,32,31,33,34,35],
-aF:function(a){var z=$.X3
-if(z===C.NU)return a
+Xw:function(a,b){return new W.uY(a,b)},
+w6:[function(a){return J.N1(a)},"$1","B4",2,0,10,51],
+Hx:[function(a){return J.UC(a)},"$1","Z6",2,0,10,51],
+Qp:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","A6",8,0,52,51,53,54,55],
+aF:function(a){if(J.xC($.X3,C.NU))return a
 if(a==null)return
-return z.Nf(a,!0)},
+return $.X3.Nf(a,!0)},
 Bo:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|ir|LP|hV|uL|Vf|G6|pv|xI|eW|Vfx|aC|VY|Dsd|Be|tuj|i6|Nr|JI|Vct|ZP|D13|nJ|LPc|Eg|i7|WZq|Gk|T53|DK|pva|BS|cda|Vb|waa|Ly|pR|V3|hx|V5|L4|V8|mO|DE|V10|U1|V11|kK|oa|V12|St|V13|IW|V14|Qh|V15|Oz|V16|Mc|V17|qk|V18|vj|LU|V19|CX|V20|md|V21|Bm|V22|Ya|V23|Ww|V24|G1|V25|fl|V26|UK|V27|wM|V28|F1|V29|qZ|V30|Uy|ZzR|kn|V31|fI|V32|zM|V33|Rk|V34|Ti|Xfs|CY|V35|nm|V36|uw|I5|V37|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|ir|LPc|hV|uL|Vf|G6|pv|xI|eW|Vfx|aC|VY|Dsd|Be|tuj|i6|Xfs|JI|Vct|ZP|D13|nJ|SaM|Eg|i7|WZq|Gk|pva|Nr|cda|MJ|T53|DK|waa|BS|V3|Vb|V5|Ly|pR|V8|hx|V10|L4|Mb|V11|mO|DE|V12|U1|qh|V13|oF|V14|Q6|uE|V15|Zn|V16|n5|V17|Ma|wN|V18|ds|V19|ou|ZzR|av|V20|uz|V21|kK|oa|V22|St|V23|IW|V24|Qh|V25|Oz|V26|YA|V27|qk|V28|vj|LU|V29|CX|V30|md|V31|Bm|V32|Ya|V33|Ww|V34|G1|V35|fl|V36|UK|V37|wM|V38|F1|V39|qZ|V40|ov|oEY|kn|V41|fI|V42|zM|V43|Rk|V44|Ti|KAf|CY|V45|nm|V46|uw|I5|V47|el"},
 zw:{
 "^":"Gv;",
 $isWO:true,
-$asWO:function(){return[W.M5]},
+$asWO:function(){return[W.QI]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.M5]},
+$isQV:true,
+$asQV:function(){return[W.QI]},
 "%":"EntryArray"},
 Ps:{
-"^":"Bo;N:target=,t5:type%,mH:href=",
+"^":"Bo;N:target=,t5:type%,mH:href=,yv:protocol=",
 bu:function(a){return a.toString()},
 "%":"HTMLAnchorElement"},
 fY:{
-"^":"Bo;N:target=,mH:href=",
+"^":"Bo;N:target=,mH:href=,yv:protocol=",
 bu:function(a){return a.toString()},
 "%":"HTMLAreaElement"},
 rZg:{
@@ -7250,7 +7514,7 @@
 if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
 return}throw H.b(P.u("Incorrect number or type of arguments"))},
 "%":"CanvasRenderingContext2D"},
-nx:{
+Zl:{
 "^":"KV;Rn:data=,B:length=",
 "%":"Comment;CharacterData"},
 K3:{
@@ -7280,7 +7544,7 @@
 Kb:function(a,b){return a.getElementById(b)},
 ek:function(a,b,c){return a.importNode(b,c)},
 Wk:function(a,b){return a.querySelector(b)},
-gi9:function(a){return H.VM(new W.RO(a,C.mt.Ph,!1),[null])},
+gi9:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
 gVl:function(a){return H.VM(new W.RO(a,C.nI.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
@@ -7336,7 +7600,7 @@
 GE:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
 Wk:function(a,b){return a.querySelector(b)},
-gi9:function(a){return H.VM(new W.Cq(a,C.mt.Ph,!1),[null])},
+gi9:function(a){return H.VM(new W.Cq(a,C.U3.Ph,!1),[null])},
 gVl:function(a){return H.VM(new W.Cq(a,C.nI.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])},
 gVY:function(a){return H.VM(new W.Cq(a,C.uh.Ph,!1),[null])},
@@ -7359,12 +7623,12 @@
 "%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
 PZ:{
 "^":"Gv;",
-gI:function(a){return new W.kd(a)},
-On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
+gI:function(a){return new W.Jn(a)},
+YJ:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
 Si:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
 $isPZ:true,
 "%":";EventTarget"},
-EN:{
+hD:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLFieldSetElement"},
 hH:{
@@ -7393,22 +7657,22 @@
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 fJ:{
-"^":"rk;il:responseText=,pf:status=",
+"^":"rk;xN:responseText=,pf:status=",
 gbA:function(a){return W.Z9(a.response)},
-Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
-eo:function(a,b,c,d){return a.open(b,c,d)},
+R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
+kP:function(a,b,c,d){return a.open(b,c,d)},
 wR:function(a,b){return a.send(b)},
 $isfJ:true,
 "%":"XMLHttpRequest"},
 rk:{
 "^":"PZ;",
 "%":";XMLHttpRequestEventTarget"},
-tb:{
+GJ:{
 "^":"Bo;fg:height},oc:name%,R:width}",
 "%":"HTMLIFrameElement"},
 Sg:{
@@ -7419,10 +7683,10 @@
 "^":"Bo;fg:height},R:width}",
 j3:function(a,b){return a.complete.$1(b)},
 "%":"HTMLImageElement"},
-Mi:{
+JK:{
 "^":"Bo;d4:checked%,MB:form=,fg:height},jx:list=,oc:name%,t5:type%,P:value%,R:width}",
 RR:function(a,b){return a.accept.$1(b)},
-$isMi:true,
+$isJK:true,
 $ish4:true,
 $isPZ:true,
 $isKV:true,
@@ -7430,7 +7694,7 @@
 ttH:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-hn:{
+pL:{
 "^":"Bo;P:value%",
 "%":"HTMLLIElement"},
 eP:{
@@ -7443,7 +7707,7 @@
 "^":"Bo;mH:href=,t5:type%",
 "%":"HTMLLinkElement"},
 cS:{
-"^":"Gv;mH:href=",
+"^":"Gv;mH:href=,yv:protocol=",
 VD:function(a){return a.reload()},
 bu:function(a){return a.toString()},
 "%":"Location"},
@@ -7453,16 +7717,16 @@
 eL:{
 "^":"Bo;kc:error=",
 xW:function(a){return a.load()},
-yy:[function(a){return a.pause()},"$0","gX0",0,0,13],
+yy:[function(a){return a.pause()},"$0","gX0",0,0,15],
 "%":"HTMLAudioElement;HTMLMediaElement",
 static:{"^":"TH<"}},
 mCi:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
-Y7:{
+Br:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
-aB:{
+aBv:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
 W7:{
@@ -7487,17 +7751,17 @@
 "%":"MIDIMessageEvent"},
 Oq:{
 "^":"w6O;",
-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.m7(p))
+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.ju(p))
 return},
 gD7:function(a){var z,y
 if(!!a.offsetX)return H.VM(new P.EX(a.offsetX,a.offsetY),[null])
 else{if(!J.x(W.qc(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
 z=W.qc(a.target)
-y=H.VM(new P.EX(a.clientX,a.clientY),[null]).W(0,J.Yq(J.HO(z)))
+y=H.VM(new P.EX(a.clientX,a.clientY),[null]).W(0,J.Yq(J.mB(z)))
 return H.VM(new P.EX(J.Kn(y.x),J.Kn(y.y)),[null])}},
 $isOq:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-ih:{
+qT:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
@@ -7519,11 +7783,11 @@
 return z==null?J.Gv.prototype.bu.call(this,a):z},
 mx:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
-FO:function(a,b,c){return a.insertBefore(b,c)},
+mK:function(a,b,c){return a.insertBefore(b,c)},
 dR:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
-yk:{
+BH:{
 "^":"w1p;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -7539,22 +7803,22 @@
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"NodeList|RadioNodeList"},
-NT:{
+yd:{
 "^":"Bo;t5:type%",
 "%":"HTMLOListElement"},
-Kc:{
+G77:{
 "^":"Bo;Rn:data=,MB:form=,fg:height},oc:name%,t5:type%,R:width}",
 "%":"HTMLObjectElement"},
 l9:{
 "^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
-UC:{
+Ea:{
 "^":"Bo;MB:form=,vH:index=,ph:label%,P:value%",
-$isUC:true,
+$isEa:true,
 "%":"HTMLOptionElement"},
 Xp:{
 "^":"Bo;MB:form=,oc:name%,t5:type=,P:value%",
@@ -7565,18 +7829,18 @@
 j6:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
-nC:{
-"^":"nx;N:target=",
+qW:{
+"^":"Zl;N:target=",
 "%":"ProcessingInstruction"},
 KR:{
 "^":"Bo;P:value%",
 "%":"HTMLProgressElement"},
-ew:{
-"^":"ea;lQ:loaded=",
-$isew:true,
+kQ:{
+"^":"ea;ox:loaded=",
+$iskQ:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 bXi:{
-"^":"ew;O3:url=",
+"^":"kQ;O3:url=",
 "%":"ResourceProgressEvent"},
 Tw:{
 "^":"Bo;t5:type%",
@@ -7590,7 +7854,7 @@
 Kb:function(a,b){return a.getElementById(b)},
 $isI0:true,
 "%":"ShadowRoot"},
-QR:{
+yNV:{
 "^":"Bo;t5:type%",
 "%":"HTMLSourceElement"},
 GA:{
@@ -7599,7 +7863,7 @@
 yg:{
 "^":"Gv;",
 "%":"SpeechInputResult"},
-Cz:{
+Hd:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
 vt:{
@@ -7621,7 +7885,7 @@
 "^":"Bo;",
 $isv6:true,
 "%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
-R1:{
+inA:{
 "^":"Bo;",
 gWT:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableElement"},
@@ -7629,7 +7893,7 @@
 "^":"Bo;RH:rowIndex=",
 $istV:true,
 "%":"HTMLTableRowElement"},
-Ix:{
+TR:{
 "^":"Bo;",
 gWT:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
@@ -7638,14 +7902,14 @@
 $isOH:true,
 "%":"HTMLTemplateElement"},
 Un:{
-"^":"nx;",
+"^":"Zl;",
 $isUn:true,
 "%":"CDATASection|Text"},
 AE:{
 "^":"Bo;MB:form=,oc:name%,WT:rows=,t5:type=,P:value%",
 $isAE:true,
 "%":"HTMLTextAreaElement"},
-R0:{
+xVu:{
 "^":"w6O;Rn:data=",
 "%":"TextEvent"},
 li:{
@@ -7657,7 +7921,7 @@
 SW:{
 "^":"eL;fg:height},R:width}",
 "%":"HTMLVideoElement"},
-u9:{
+K5:{
 "^":"PZ;oc:name%,pf:status%",
 geT:function(a){return W.Pv(a.parent)},
 S6:function(a){return a.close()},
@@ -7665,16 +7929,16 @@
 return},
 D9:function(a,b,c){return this.kr(a,b,c,null)},
 bu:function(a){return a.toString()},
-gi9:function(a){return H.VM(new W.RO(a,C.mt.Ph,!1),[null])},
+gi9:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
-$isu9:true,
+$isK5:true,
 $isPZ:true,
 "%":"DOMWindow|Window"},
 Bn:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
 o5:{
-"^":"Gv;OR:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,R:width=",
+"^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,R:width=",
 bu:function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},
 n:function(a,b){var z,y,x
 if(b==null)return!1
@@ -7703,11 +7967,11 @@
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
-yX:{
+NfA:{
 "^":"Bo;",
 $isPZ:true,
 "%":"HTMLFrameSetElement"},
-QV:{
+rhM:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -7723,8 +7987,8 @@
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]},
+$isQV:true,
+$asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"MozNamedAttrMap|NamedNodeMap"},
 mNY:{
@@ -7743,8 +8007,8 @@
 $isWO:true,
 $asWO:function(){return[W.yg]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.yg]},
+$isQV:true,
+$asQV:function(){return[W.yg]},
 $isXj:true,
 "%":"SpeechInputResultList"},
 LO:{
@@ -7763,8 +8027,8 @@
 $isWO:true,
 $asWO:function(){return[W.my]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.my]},
+$isQV:true,
+$asQV:function(){return[W.my]},
 $isXj:true,
 "%":"SpeechRecognitionResultList"},
 VG:{
@@ -7789,7 +8053,7 @@
 Jd:function(a){return this.XP(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-aP:function(a,b,c){var z,y,x
+xe:function(a,b,c){var z,y,x
 if(b>this.VO.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.VO
 y=z.length
@@ -7797,14 +8061,15 @@
 if(b===y)x.appendChild(c)
 else{if(b>=y)return H.e(z,b)
 x.insertBefore(c,z[b])}},
-Mh:function(a,b,c){throw H.b(P.SY(null))},
+Yj:function(a,b,c){throw H.b(P.SY(null))},
 V1:function(a){J.r4(this.MW)},
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asrm:function(){return[W.h4]},
+$aseD:function(){return[W.h4]},
 $asWO:function(){return[W.h4]},
-$ascX:function(){return[W.h4]}},
+$asQV:function(){return[W.h4]}},
 TS:{
 "^":"rm;Sn,Sc",
 gB:function(a){return this.Sn.length},
@@ -7817,59 +8082,59 @@
 Jd:function(a){return this.XP(a,null)},
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
-gi9:function(a){return H.VM(new W.Uc(this,!1,C.mt.Ph),[null])},
+gi9:function(a){return H.VM(new W.Uc(this,!1,C.U3.Ph),[null])},
 gLm:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
 S8:function(a,b){var z=C.t5.ev(this.Sn,new W.HU())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null,
+$isQV:true,
+$asQV:null,
 static:{vD:function(a,b){var z=H.VM(new W.TS(a,null),[b])
 z.S8(a,b)
 return z}}},
 HU:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
-M5:{
+QI:{
 "^":"Gv;"},
-kd:{
+Jn:{
 "^":"a;WK<",
 t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
 DM:{
-"^":"kd;WK:YO<,WK",
+"^":"Jn;WK:YO<,WK",
 t:function(a,b){var z,y
-z=$.Z2()
+z=$.PO()
 y=J.rY(b)
 if(z.gvc().Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.Cq(this.YO,z.t(0,y.hc(b)),!1),[null])
 return H.VM(new W.Cq(this.YO,b,!1),[null])},
-static:{"^":"xW"}},
+static:{"^":"Ha"}},
 RAp:{
 "^":"Gv+lD;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 ecX:{
 "^":"RAp+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
-Kx:{
-"^":"Xs:30;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,91,"call"],
+$isQV:true,
+$asQV:function(){return[W.KV]}},
+KxY:{
+"^":"Tp:10;",
+$1:[function(a){return J.Du(a)},"$1",null,2,0,null,107,"call"],
 $isEH:true},
-Cs:{
-"^":"Xs:50;a",
+bU2:{
+"^":"Tp:67;a",
 $2:function(a,b){this.a.setRequestHeader(a,b)},
 $isEH:true},
 bU:{
-"^":"Xs:30;b,c",
+"^":"Tp:10;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -7888,7 +8153,7 @@
 h:function(a,b){this.NL.appendChild(b)},
 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)},
-aP:function(a,b,c){var z,y,x
+xe:function(a,b,c){var z,y,x
 if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.NL
 y=z.childNodes
@@ -7900,8 +8165,8 @@
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.Qk(z,c,y[b])},
-Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
+J.nt(z,c,y[b])},
+Yj:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
 V1:function(a){J.r4(this.NL)},
 u:function(a,b,c){var z,y
 z=this.NL
@@ -7920,64 +8185,65 @@
 return z[b]},
 $iswi:true,
 $asrm:function(){return[W.KV]},
+$aseD:function(){return[W.KV]},
 $asWO:function(){return[W.KV]},
-$ascX:function(){return[W.KV]}},
+$asQV:function(){return[W.KV]}},
 nNL:{
 "^":"Gv+lD;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 w1p:{
 "^":"nNL+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 yoo:{
 "^":"Gv+lD;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 kEI:{
 "^":"yoo+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.KV]}},
+$isQV:true,
+$asQV:function(){return[W.KV]}},
 zLC:{
 "^":"Gv+lD;",
 $isWO:true,
 $asWO:function(){return[W.yg]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.yg]}},
+$isQV:true,
+$asQV:function(){return[W.yg]}},
 x5e:{
 "^":"zLC+Gm;",
 $isWO:true,
 $asWO:function(){return[W.yg]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.yg]}},
+$isQV:true,
+$asQV:function(){return[W.yg]}},
 dxW:{
 "^":"Gv+lD;",
 $isWO:true,
 $asWO:function(){return[W.my]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.my]}},
+$isQV:true,
+$asQV:function(){return[W.my]}},
 HRa:{
 "^":"dxW+Gm;",
 $isWO:true,
 $asWO:function(){return[W.my]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[W.my]}},
+$isQV:true,
+$asQV:function(){return[W.my]}},
 a7B:{
 "^":"a;",
 FV:function(a,b){J.kH(b,new W.Zc(this))},
@@ -7991,7 +8257,7 @@
 y=H.VM([],[P.qU])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
 if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
-y.push(J.tE(z[w]))}}return y},
+y.push(J.O6(z[w]))}}return y},
 gUQ:function(a){var z,y,x,w
 z=this.MW.attributes
 y=H.VM([],[P.qU])
@@ -8003,7 +8269,7 @@
 $isZ0:true,
 $asZ0:function(){return[P.qU,P.qU]}},
 Zc:{
-"^":"Xs:50;a",
+"^":"Tp:67;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 E9:{
@@ -8018,7 +8284,7 @@
 return y},
 gB:function(a){return this.gvc().length},
 FJ:function(a){return a.namespaceURI==null}},
-iW:{
+ye:{
 "^":"As3;QX,Kd",
 lF:function(){var z=P.Ls(null,null,null,P.qU)
 this.Kd.aN(0,new W.Si(z))
@@ -8027,20 +8293,20 @@
 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)},
 OS:function(a){this.Kd.aN(0,new W.vf(a))},
-yJ:function(a){this.Kd=H.VM(new H.lJ(P.F(this.QX,!0,null),new W.Xw()),[null,null])},
-static:{or:function(a){var z=new W.iW(a,null)
+yJ:function(a){this.Kd=H.VM(new H.lJ(P.F(this.QX,!0,null),new W.Zu()),[null,null])},
+static:{or:function(a){var z=new W.ye(a,null)
 z.yJ(a)
 return z}}},
-Xw:{
-"^":"Xs:30;",
+Zu:{
+"^":"Tp:10;",
 $1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Si:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a.FV(0,a.lF())},
 $isEH:true},
 vf:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){return a.OS(this.a)},
 $isEH:true},
 I4:{
@@ -8051,10 +8317,10 @@
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))}},
-pq:{
+FkO:{
 "^":"a;Ph",
-zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
-LX:function(a){return this.zc(a,!1)}},
+DT:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
+LX:function(a){return this.DT(a,!1)}},
 RO:{
 "^":"cb;bi,Ph,Sg",
 KR:function(a,b,c,d){var z=new W.fd(0,this.bi,this.Ph,W.aF(a),this.Sg)
@@ -8069,12 +8335,12 @@
 return H.VM(new P.c9(new W.tS(b),z),[H.ip(z,"cb",0),null])},
 $iscb:true},
 ie:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
 tS:{
-"^":"Xs:30;b",
-$1:[function(a){J.yB(a,this.b)
+"^":"Tp:10;b",
+$1:[function(a){J.SS(a,this.b)
 return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Uc:{
@@ -8093,12 +8359,12 @@
 yI:function(a){return this.KR(a,null,null,null)},
 $iscb:true},
 i2:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
 b0:{
-"^":"Xs:30;b",
-$1:[function(a){J.yB(a,this.b)
+"^":"Tp:10;b",
+$1:[function(a){J.SS(a,this.b)
 return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 fd:{
@@ -8110,30 +8376,30 @@
 return},
 Fv:[function(a,b){if(this.bi==null)return;++this.VP
 this.Jc()
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,82,18,83],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,99,20,100],
 gUF:function(){return this.VP>0},
-ue:[function(a){if(this.bi==null||this.VP<=0)return;--this.VP
-this.Zz()},"$0","gDQ",0,0,13],
+zl:[function(a){if(this.bi==null||this.VP<=0)return;--this.VP
+this.Zz()},"$0","gDQ",0,0,15],
 Zz:function(){var z=this.G9
-if(z!=null&&this.VP<=0)J.cZ(this.bi,this.Ph,z,this.Sg)},
+if(z!=null&&this.VP<=0)J.FI(this.bi,this.Ph,z,this.Sg)},
 Jc:function(){var z=this.G9
 if(z!=null)J.pW(this.bi,this.Ph,z,this.Sg)}},
 qO:{
-"^":"a;aV,eM",
+"^":"a;aV,uZ",
 h:function(a,b){var z,y
-z=this.eM
+z=this.uZ
 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()))},
-Rz:function(a,b){var z=this.eM.Rz(0,b)
+z.u(0,b,b.zC(y.ght(y),new W.rC(this,b),this.aV.gGj()))},
+Rz:function(a,b){var z=this.uZ.Rz(0,b)
 if(z!=null)z.ed()},
 S6:[function(a){var z,y
-for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
+for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.S6(0)},"$0","gJK",0,0,13],
+this.aV.S6(0)},"$0","gJK",0,0,15],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
-RX:{
-"^":"Xs:47;a,b",
+rC:{
+"^":"Tp:64;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Gm:{
@@ -8143,17 +8409,17 @@
 FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 XP:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
 Jd:function(a){return this.XP(a,null)},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
-Mh:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
+Yj:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 uB:{
 "^":"rm;xa",
 gA:function(a){return H.VM(new W.LV(J.mY(this.xa)),[null])},
@@ -8166,14 +8432,14 @@
 u:function(a,b,c){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},
-sB:function(a,b){J.wg(this.xa,b)},
+sB:function(a,b){J.Vw(this.xa,b)},
 XP:function(a,b){J.br(this.xa,b)},
 Jd:function(a){return this.XP(a,null)},
 XU:function(a,b,c){return J.q6(this.xa,b,c)},
 u8:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){return J.ff(this.xa,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-aP:function(a,b,c){return J.Mx(this.xa,b,c)},
+xe:function(a,b,c){return J.Vk(this.xa,b,c)},
 YW:function(a,b,c,d,e){J.VZ(this.xa,b,c,d,e)},
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){J.ul(this.xa,b,c)}},
@@ -8192,21 +8458,21 @@
 this.Nq=y
 return!1},
 gl:function(){return this.QZ}},
-vZ:{
-"^":"Xs:30;a,b",
+uY:{
+"^":"Tp:10;a,b",
 $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)},"$1",null,2,0,null,31,"call"],
+return this.a(a)},"$1",null,2,0,null,51,"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
 S6:function(a){return this.Ui.close()},
-kr:function(a,b,c,d){this.Ui.postMessage(b,c)},
+kr:function(a,b,c,d){this.Ui.postMessage(P.bL(b),c)},
 D9:function(a,b,c){return this.kr(a,b,c,null)},
 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."))},
+YJ:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Si:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isPZ:true,
 static:{P1:function(a){if(a===window)return a
@@ -8220,106 +8486,106 @@
 Y0:{
 "^":"zp;N:target=,mH:href=",
 "%":"SVGAElement"},
-ig:{
+ZJQ:{
 "^":"Pt;mH:href=",
 "%":"SVGAltGlyphElement"},
-qb:{
-"^":"d5;yG:result=,x=,y=",
+jwG:{
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEBlendElement"},
-C7:{
-"^":"d5;t5:type=,UQ:values=,yG:result=,x=,y=",
+bd:{
+"^":"MB;t5:type=,UQ:values=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 R8:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
 nQ:{
-"^":"d5;xS:operator=,yG:result=,x=,y=",
+"^":"MB;xS:operator=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
-EfE:{
-"^":"d5;yG:result=,x=,y=",
+B3:{
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
 wfu:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
 ha:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEFloodElement"},
 mz:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
-Ob:{
-"^":"d5;yG:result=,x=,y=,mH:href=",
+vz:{
+"^":"MB;yG:result=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
-bO:{
-"^":"d5;yG:result=,x=,y=",
+Tf:{
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEMergeElement"},
-wC:{
-"^":"d5;xS:operator=,yG:result=,x=,y=",
+yum:{
+"^":"MB;xS:operator=,yG:result=,x=,y=",
 "%":"SVGFEMorphologyElement"},
 MI:{
-"^":"d5;yG:result=,x=,y=",
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFEOffsetElement"},
-Ub:{
-"^":"d5;x=,y=",
+rg:{
+"^":"MB;x=,y=",
 "%":"SVGFEPointLightElement"},
-xX:{
-"^":"d5;yG:result=,x=,y=",
+bMB:{
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
-FG:{
-"^":"d5;x=,y=",
+HAk:{
+"^":"MB;x=,y=",
 "%":"SVGFESpotLightElement"},
-Rg:{
-"^":"d5;yG:result=,x=,y=",
+Qya:{
+"^":"MB;yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
-"^":"d5;t5:type=,yG:result=,x=,y=",
+"^":"MB;t5:type=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
-QN:{
-"^":"d5;x=,y=,mH:href=",
+OE5:{
+"^":"MB;x=,y=,mH:href=",
 "%":"SVGFilterElement"},
 mg:{
 "^":"zp;x=,y=",
 "%":"SVGForeignObjectElement"},
-en:{
+TQ:{
 "^":"zp;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 zp:{
-"^":"d5;",
+"^":"MB;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 SL:{
 "^":"zp;x=,y=,mH:href=",
 "%":"SVGImageElement"},
 NBZ:{
-"^":"d5;x=,y=",
+"^":"MB;x=,y=",
 "%":"SVGMaskElement"},
 Ac:{
-"^":"d5;x=,y=,mH:href=",
+"^":"MB;x=,y=,mH:href=",
 "%":"SVGPatternElement"},
 NJ:{
-"^":"en;x=,y=",
+"^":"TQ;x=,y=",
 "%":"SVGRectElement"},
 nd:{
-"^":"d5;t5:type%,mH:href=",
+"^":"MB;t5:type%,mH:href=",
 "%":"SVGScriptElement"},
 EUL:{
-"^":"d5;t5:type%",
+"^":"MB;t5:type%",
 "%":"SVGStyleElement"},
-d5:{
+MB:{
 "^":"h4;",
 gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
 return a._cssClassSet},
 gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
-gi9:function(a){return H.VM(new W.Cq(a,C.mt.Ph,!1),[null])},
+gi9:function(a){return H.VM(new W.Cq(a,C.U3.Ph,!1),[null])},
 gVl:function(a){return H.VM(new W.Cq(a,C.nI.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])},
 gVY:function(a){return H.VM(new W.Cq(a,C.uh.Ph,!1),[null])},
 gf0:function(a){return H.VM(new W.Cq(a,C.Kq.Ph,!1),[null])},
 $isPZ:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|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",
-static:{"^":"SH<"}},
+static:{"^":"OY<"}},
 hy:{
 "^":"zp;x=,y=",
 Kb:function(a,b){return a.getElementById(b)},
@@ -8338,32 +8604,32 @@
 "^":"zp;x=,y=,mH:href=",
 "%":"SVGUseElement"},
 cuU:{
-"^":"d5;mH:href=",
+"^":"MB;mH:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
 O7:{
-"^":"As3;CE",
+"^":"As3;LO",
 lF:function(){var z,y,x,w
-z=this.CE.getAttribute("class")
+z=this.LO.getAttribute("class")
 y=P.Ls(null,null,null,P.qU)
 if(z==null)return y
 for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
 if(w.length!==0)y.h(0,w)}return y},
-p5:function(a){this.CE.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
+p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
 "^":"",
-Hj:{
+QmI:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
-hq:{
+wC:{
 "^":"a;",
-$ishq:true,
+$iswC:true,
 static:{Jz:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-z8:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
+xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,36,37,38,39],
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,38,56,24,57],
 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},
@@ -8373,22 +8639,22 @@
 if(a==null)return
 else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 else{z=J.x(a)
-if(!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isu9)return a
+if(!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isK5)return a
 else 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()))}},"$1","En",2,0,30,40],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,10,58],
 hE:function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 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=!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isu9}else z=!1
+z=!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isK5}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
-else return P.ND(a)}},"$1","Xl",2,0,25,40],
+else return P.ND(a)}},"$1","Xl",2,0,46,58],
 ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.LZ(),new P.Jd())
 else return P.iQ(a,$.LZ(),new P.QS())},
@@ -8409,11 +8675,11 @@
 try{z=String(this.eh)
 return z}catch(y){H.Ru(y)
 return P.a.prototype.bu.call(this,this)}},
-K9:function(a,b){var z,y
+V7:function(a,b){var z,y
 z=this.eh
 y=b==null?null:P.F(H.VM(new H.lJ(b,P.En()),[null,null]),!0,null)
 return P.dU(z[a].apply(z,y))},
-nQ:function(a){return this.K9(a,null)},
+nQ:function(a){return this.V7(a,null)},
 $isE4:true,
 static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
@@ -8423,9 +8689,9 @@
 x=z.bind.apply(z,y)
 String(x)
 return P.ND(new x())},Oe:function(a){if(a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
-return P.ND(P.wY(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
+return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
 Xb:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -8433,10 +8699,10 @@
 if(!!y.$isZ0){x={}
 z.u(0,a,x)
 for(z=J.mY(a.gvc());z.G();){w=z.gl()
-x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$iscX){v=[]
+x[w]=this.$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)},"$1",null,2,0,null,40,"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,58,"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh",
@@ -8445,7 +8711,8 @@
 y=P.F(H.VM(new H.lJ(a,P.En()),[null,null]),!0,null)
 return P.dU(this.eh.apply(z,y))},
 PO:function(a){return this.qP(a,null)},
-$isr7:true},
+$isr7:true,
+static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
 Tz:{
 "^":"F6;eh",
 t:function(a,b){var z
@@ -8460,12 +8727,12 @@
 if(typeof z==="number"&&z>>>0===z)return z
 throw H.b(P.w("Bad JsArray length"))},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:function(a,b){this.K9("push",[b])},
-FV:function(a,b){this.K9("push",b instanceof Array?b:P.F(b,!0,null))},
-aP:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
-this.K9("splice",[b,0,c])},
+h:function(a,b){this.V7("push",[b])},
+FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
+xe:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
+this.V7("splice",[b,0,c])},
 UZ:function(a,b,c){P.oY(b,c,this.gB(this))
-this.K9("splice",[b,c-b])},
+this.V7("splice",[b,c-b])},
 YW:function(a,b,c,d,e){var z,y,x
 z=this.gB(this)
 if(b<0||b>z)H.vh(P.TE(b,0,z))
@@ -8475,9 +8742,9 @@
 if(e<0)throw H.b(P.u(e))
 x=[b,y]
 C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
-this.K9("splice",x)},
+this.V7("splice",x)},
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-XP:function(a,b){this.K9("sort",[b])},
+XP:function(a,b){this.V7("sort",[b])},
 Jd:function(a){return this.XP(a,null)},
 static:{oY:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
 if(b<a||b>c)throw H.b(P.TE(b,a,c))}}},
@@ -8486,28 +8753,28 @@
 $isWO:true,
 $asWO:null,
 $isyN:true,
-$iscX:true,
-$ascX:null},
+$isQV:true,
+$asQV:null},
 DV:{
-"^":"Xs:30;",
-$1:function(a){var z=P.z8(a,!1)
+"^":"Tp:10;",
+$1:function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},
 $isEH:true},
 Hp:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return new P.r7(a)},
 $isEH:true},
 Jd:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return H.VM(new P.Tz(a),[null])},
 $isEH:true},
 QS:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return new P.E4(a)},
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
@@ -8532,34 +8799,34 @@
 if(a>b)return a
 if(a<b)return b
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
-if(C.ON.gG0(b))return b
+if(C.YI.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
 return a},
 mgb:{
 "^":"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))
+j1:function(a){if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 return Math.random()*a>>>0}},
 vY:{
-"^":"a;AW,mK",
-hJ:function(){var z,y,x,w,v,u
-z=this.AW
+"^":"a;Pd,Ak",
+Ad:function(){var z,y,x,w,v,u
+z=this.Pd
 y=4294901760*z
 x=(y&4294967295)>>>0
 w=55905*z
 v=(w&4294967295)>>>0
-u=v+x+this.mK
+u=v+x+this.Ak
 z=(u&4294967295)>>>0
-this.AW=z
-this.mK=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+this.Pd=z
+this.Ak=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
 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))
+if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.hJ()
-return(this.AW&z)>>>0}do{this.hJ()
-y=this.AW
+if((a&z)===0){this.Ad()
+return(this.Pd&z)>>>0}do{this.Ad()
+y=this.Pd
 x=y%a}while(y-x+a>=4294967296)
 return x},
-XR:function(a){var z,y,x,w,v,u,t,s
+qR: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)
@@ -8581,20 +8848,20 @@
 v=(x<<31>>>0)+x
 u=(v&4294967295)>>>0
 y=C.jn.cU(v-u,4294967296)
-v=this.AW*1037
+v=this.Pd*1037
 t=(v&4294967295)>>>0
-this.AW=t
-s=(this.mK*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
-this.mK=s
-this.AW=(t^u)>>>0
-this.mK=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
-if(this.mK===0&&this.AW===0)this.AW=23063
-this.hJ()
-this.hJ()
-this.hJ()
-this.hJ()},
-static:{"^":"tgM,LA,JYU",r2:function(a){var z=new P.vY(0,0)
-z.XR(a)
+this.Pd=t
+s=(this.Ak*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
+this.Ak=s
+this.Pd=(t^u)>>>0
+this.Ak=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
+if(this.Ak===0&&this.Pd===0)this.Pd=23063
+this.Ad()
+this.Ad()
+this.Ad()
+this.Ad()},
+static:{"^":"tgM,dB,JYU",r2:function(a){var z=new P.vY(0,0)
+z.qR(a)
 return z}}},
 EX:{
 "^":"a;x>,y>",
@@ -8657,7 +8924,7 @@
 if(typeof z!=="number")return z.g()
 if(typeof y!=="number")return H.s(y)
 return z+y},
-gOR:function(a){var z,y
+gQG:function(a){var z,y
 z=this.gG6(this)
 y=this.fg
 if(typeof z!=="number")return z.g()
@@ -8679,7 +8946,7 @@
 if(x+w===z.gT8(b)){x=this.fg
 if(typeof y!=="number")return y.g()
 if(typeof x!=="number")return H.s(x)
-z=y+x===z.gOR(b)}else z=!1}else z=!1}else z=!1
+z=y+x===z.gQG(b)}else z=!1}else z=!1}else z=!1
 return z},
 giO:function(a){var z,y,x,w,v,u
 z=J.v1(this.gBb(this))
@@ -8710,8 +8977,8 @@
 return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
 ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
-A2:{
-"^":"mA;F4"},
+Gj:{
+"^":"mA;EV"},
 mA:{
 "^":"Nx+cw;",
 $isZ0:true},
@@ -8723,22 +8990,22 @@
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:function(a,b){return this.F4.t(0,b)},
-u:function(a,b,c){this.F4.u(0,b,c)},
-FV:function(a,b){this.F4.FV(0,b)},
-V1:function(a){this.F4.V1(0)},
-aN:function(a,b){this.F4.aN(0,b)},
-gl0:function(a){return this.F4.X5===0},
-gor:function(a){return this.F4.X5!==0},
-gvc:function(){var z=this.F4
+t:function(a,b){return this.EV.t(0,b)},
+u:function(a,b,c){this.EV.u(0,b,c)},
+FV:function(a,b){this.EV.FV(0,b)},
+V1:function(a){this.EV.V1(0)},
+aN:function(a,b){this.EV.aN(0,b)},
+gl0:function(a){return this.EV.X5===0},
+gor:function(a){return this.EV.X5!==0},
+gvc:function(){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gB:function(a){return this.F4.X5},
-gUQ:function(a){var z=this.F4
+gB:function(a){return this.EV.X5},
+gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
-bu:function(a){return P.vW(this.F4)},
+bu:function(a){return P.vW(this.EV)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
-m6:function(a){a.toString
+ic:function(a){a.toString
 return a},
 jZN:function(a){a.toString
 return a},
@@ -8757,7 +9024,7 @@
 ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
 $ispF:true,
 $isAS:true,
-"%":";ArrayBufferView;we|Nb|GVy|Dg|Ui|Ipv|Pg"},
+"%":";ArrayBufferView;we|Ob|GVy|Dg|Ui|Ipv|Pg"},
 di:{
 "^":"pF;",
 gbx:function(a){return C.T1},
@@ -8775,8 +9042,8 @@
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.CP]},
+$isQV:true,
+$asQV:function(){return[P.CP]},
 $isAS:true,
 "%":"Float32Array"},
 K8Q:{
@@ -8791,11 +9058,11 @@
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.CP]},
+$isQV:true,
+$asQV:function(){return[P.CP]},
 $isAS:true,
 "%":"Float64Array"},
-Hd:{
+PS:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
 t:function(a,b){var z=a.length
@@ -8807,13 +9074,13 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"Int16Array"},
 dE5:{
 "^":"Pg;",
-gbx:function(a){return C.KA},
+gbx:function(a){return C.KS},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -8823,8 +9090,8 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"Int32Array"},
 IJ:{
@@ -8839,8 +9106,8 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"Int8Array"},
 us:{
@@ -8855,8 +9122,8 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"Uint16Array"},
 rs:{
@@ -8871,8 +9138,8 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"Uint32Array"},
 eEV:{
@@ -8888,11 +9155,11 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
-V6:{
+V6a:{
 "^":"Pg;",
 gbx:function(a){return C.HC},
 gB:function(a){return a.length},
@@ -8905,8 +9172,8 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]},
+$isQV:true,
+$asQV:function(){return[P.KN]},
 $isAS:true,
 "%":";Uint8Array"},
 we:{
@@ -8933,17 +9200,17 @@
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.CP]}},
-Nb:{
+$isQV:true,
+$asQV:function(){return[P.CP]}},
+Ob:{
 "^":"we+lD;",
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.CP]}},
+$isQV:true,
+$asQV:function(){return[P.CP]}},
 GVy:{
-"^":"Nb+Lj;"},
+"^":"Ob+Lj;"},
 Pg:{
 "^":"Ipv;",
 YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
@@ -8953,15 +9220,15 @@
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]}},
+$isQV:true,
+$asQV:function(){return[P.KN]}},
 Ui:{
 "^":"we+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.KN]}},
+$isQV:true,
+$asQV:function(){return[P.KN]}},
 Ipv:{
 "^":"Ui+Lj;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
 "^":"",
@@ -8976,7 +9243,7 @@
 gkc:function(a){return a.Py},
 skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
 static:{Yw:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9003,11 +9270,11 @@
 sFR:function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},
 gCf:function(a){return a.y4},
 sCf:function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},
-az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
+az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isJK").value
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,69,1,70,71],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,86,1,87,88],
 Z1:[function(a,b,c,d){var z,y,x
 J.fD(b)
 z=a.a3
@@ -9015,13 +9282,13 @@
 if(a.Ln!=null){y=P.Fl(null,null)
 x=R.tB(y)
 J.kW(x,"expr",z)
-J.Mx(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZ2",6,0,69,1,70,71],
+J.Vk(a.y4,0,x)
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,86,1,87,88],
 YC:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,92,1],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,108,1],
 static:{Rp:function(a){var z,y,x,w,v
 z=R.tB([])
-y=$.Nd()
+y=$.XZ()
 x=P.YM(null,null,null,P.qU,W.I0)
 w=P.qU
 v=W.h4
@@ -9038,12 +9305,12 @@
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Xs:30;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,93,"call"],
+"^":"Tp:10;a",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,109,"call"],
 $isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Eg:{
-"^":"LPc;fe,l1,bY,jv,oy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"SaM;fe,l1,bY,jv,oy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gv8:function(a){return a.fe},
 sv8:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
 gph:function(a){return a.l1},
@@ -9060,9 +9327,9 @@
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Kz(a)).wM(new R.uv(a))}},"$3","gbN",6,0,54,22,23,55],
+this.LY(a,a.jv).ml(new R.uv(a)).wM(new R.Ou(a))}},"$3","gbN",6,0,71,43,44,72],
 static:{fL:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9075,27 +9342,27 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.qL.ZL(a)
-C.qL.XI(a)
+C.UF.ZL(a)
+C.UF.XI(a)
 return a}}},
-LPc:{
+SaM:{
 "^":"ir+Pi;",
 $isd3:true},
-Kz:{
-"^":"Xs:94;a",
-$1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,60,"call"],
-$isEH:true},
 uv:{
-"^":"Xs:47;b",
+"^":"Tp:110;a",
+$1:[function(a){var z=this.a
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,77,"call"],
+$isEH:true},
+Ou:{
+"^":"Tp:64;b",
 $0:[function(){var z=this.b
 z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 i7:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-static:{dq:function(a){var z,y,x,w
-z=$.Nd()
+static:{qb:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9104,17 +9371,17 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.Yl.ZL(a)
-C.Yl.XI(a)
+C.MC.ZL(a)
+C.MC.XI(a)
 return a}}}}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 Gk:{
 "^":"WZq;KV,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-RF:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,15,65],
+RF:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,17,82],
 static:{Sy:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9127,6 +9394,46 @@
 return a}}},
 WZq:{
 "^":"uL+Pi;",
+$isd3:true}}],["flag_list_element","package:observatory/src/elements/flag_list.dart",,X,{
+"^":"",
+Nr:{
+"^":"pva;DC,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gpM:function(a){return a.DC},
+spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
+RF:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,17,82],
+static:{na:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.uG.ZL(a)
+C.uG.XI(a)
+return a}}},
+pva:{
+"^":"uL+Pi;",
+$isd3:true},
+MJ:{
+"^":"cda;Zc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gJ6:function(a){return a.Zc},
+sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
+static:{Bs:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Cl.ZL(a)
+C.Cl.XI(a)
+return a}}},
+cda:{
+"^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 DK:{
@@ -9146,7 +9453,7 @@
 a.MC=this.ct(a,C.ak,a.MC,x)
 if(y){y=J.U6(z)
 y=y.t(z,"owner")!=null&&J.xC(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.oX=this.ct(a,C.Ql,a.oX,y)},"$1","gLe",2,0,15,34],
+a.oX=this.ct(a,C.Ql,a.oX,y)},"$1","gLe",2,0,17,54],
 gSY:function(a){return a.MC},
 sSY:function(a,b){a.MC=this.ct(a,C.ak,a.MC,b)},
 gE7:function(a){return a.oX},
@@ -9154,7 +9461,7 @@
 gni:function(a){return a.Oc},
 sni:function(a,b){a.Oc=this.ct(a,C.a0,a.Oc,b)},
 static:{E5:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9175,9 +9482,9 @@
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 BS:{
-"^":"pva;C9,Sq,ZZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gig:function(a){return a.C9},
-sig:function(a,b){a.C9=this.ct(a,C.nf,a.C9,b)},
+"^":"waa;P6,Sq,ZZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gig:function(a){return a.P6},
+sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
 gUx:function(a){return a.Sq},
 sUx:function(a,b){a.Sq=this.ct(a,C.AO,a.Sq,b)},
 gfY:function(a){return a.ZZ},
@@ -9194,9 +9501,9 @@
 yM:[function(a,b){var z,y
 this.ct(a,C.AO,0,1)
 this.ct(a,C.Lc,0,1)
-z=this.W7(a,a.C9)
+z=this.W7(a,a.P6)
 a.Sq=this.ct(a,C.AO,a.Sq,z)
-z=J.UQ(a.C9,"kind")
+z=J.UQ(a.P6,"kind")
 y=a.ZZ
 switch(z){case"kRegularFunction":a.ZZ=this.ct(a,C.Lc,y,"function")
 break
@@ -9223,10 +9530,10 @@
 case"kInvokeFieldDispatcher":a.ZZ=this.ct(a,C.Lc,y,"invoke field dispatcher")
 break
 default:a.ZZ=this.ct(a,C.Lc,y,"UNKNOWN")
-break}},"$1","gnp",2,0,15,34],
-RF:[function(a,b){J.LE(a.C9).wM(b)},"$1","gvC",2,0,15,65],
-static:{nz:function(a){var z,y,x,w
-z=$.Nd()
+break}},"$1","gnp",2,0,17,54],
+RF:[function(a,b){J.LE(a.P6).wM(b)},"$1","gvC",2,0,17,82],
+static:{N0:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9234,18 +9541,18 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.p0.ZL(a)
-C.p0.XI(a)
+C.cI.ZL(a)
+C.cI.XI(a)
 return a}}},
-pva:{
+waa:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
 Hz:{
 "^":"a;zE,mS",
-m0:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,95],
+PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,111],
 gvH:function(a){return C.CD.cU(this.mS,4)},
-static:{"^":"Q0z",Iu:function(a,b){var z,y,x
+static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=b.gy(b)
 y=J.DO(a)
 if(typeof z!=="number")return z.U()
@@ -9256,7 +9563,7 @@
 uc:{
 "^":"a;Yu<,tL"},
 Vb:{
-"^":"cda;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V3;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gpf:function(a){return a.PA},
 spf:function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},
 gyw:function(a){return a.oj},
@@ -9273,7 +9580,7 @@
 for(z=J.mY(b),y=0;z.G();){x=z.lo
 if(typeof x!=="number")return H.s(x)
 y=y*256+x}return y},
-fJ:function(a,b,c,d){var z=J.uH(c,"@")
+tn:function(a,b,c,d){var z=J.uH(c,"@")
 if(0>=z.length)return H.e(z,0)
 a.UL.u(0,b,z[0])
 a.rM.u(0,b,d)
@@ -9289,15 +9596,15 @@
 if(0>=u.length)return H.e(u,0)
 y.u(0,t,u[0])
 x.u(0,t,r)
-w.u(0,this.LV(a,r),t)}this.fJ(a,c,"Free",$.aw())
-this.fJ(a,0,"",$.Sd())},
+w.u(0,this.LV(a,r),t)}this.tn(a,c,"Free",$.Rl())
+this.tn(a,0,"",$.Sd())},
 WE:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.dW
 y=J.DO(a.An)
 if(typeof z!=="number")return z.U()
 if(typeof y!=="number")return H.s(y)
 x=z*y
-w=C.CD.cU(O.Iu(a.An,b).mS,4)
+w=C.CD.cU(O.x6(a.An,b).mS,4)
 v=C.CD.Z(w,x)
 u=C.CD.Y(w,x)
 t=J.UQ(a.oj,"pages")
@@ -9322,19 +9629,19 @@
 break}o+=2}z=H.BU(z.t(s,"object_start"),null,null)
 y=J.UQ(a.oj,"unit_size_bytes")
 if(typeof y!=="number")return H.s(y)
-return new O.uc(J.WB(z,u*y),J.vX(p,J.UQ(a.oj,"unit_size_bytes")))},
+return new O.uc(J.ew(z,u*y),J.vX(p,J.UQ(a.oj,"unit_size_bytes")))},
 U8:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y=this.WE(a,z.gD7(b))
-x=H.d(y.tL)+"B @ 0x"+J.u1(y.Yu,16)
+x=H.d(y.tL)+"B @ 0x"+J.cR(y.Yu,16)
 z=z.gD7(b)
-z=O.Iu(a.An,z)
+z=O.x6(a.An,z)
 w=z.mS
-v=a.UL.t(0,a.Ge.t(0,this.LV(a,C.mU.Mu(J.Qd(z.zE),w,w+4))))
+v=a.UL.t(0,a.Ge.t(0,this.LV(a,C.yp.Mu(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,92,59],
-f1:[function(a,b){var z=J.u1(this.WE(a,J.WS(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,92,59],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,108,76],
+X7:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,108,76],
 My:function(a){var z,y,x,w
 z=a.oj
 if(z==null||a.hi==null)return
@@ -9364,7 +9671,7 @@
 x=a.dW
 if(typeof x!=="number")return H.s(x)
 w=b*x
-v=O.Iu(a.An,H.VM(new P.EX(0,w),[null]))
+v=O.x6(a.An,H.VM(new P.EX(0,w),[null]))
 u=J.UQ(y.t(z,b),"objects")
 y=J.U6(u)
 x=a.rM
@@ -9377,7 +9684,7 @@
 for(;s=J.Wx(r),p=s.W(r,1),s.D(r,0);r=p){s=v.zE
 o=v.mS
 n=o+4
-C.mU.vg(J.Qd(s),o,n,q)
+C.yp.vg(J.Qd(s),o,n,q)
 v=new O.Hz(s,n)}t+=2}y=a.dW
 if(typeof y!=="number")return H.s(y)
 m=w+y
@@ -9395,20 +9702,20 @@
 if(!(l<m))break
 x=$.Sd()
 n=y+4
-C.mU.vg(o.gRn(s),y,n,x)
+C.yp.vg(o.gRn(s),y,n,x)
 v=new O.Hz(s,n)}y=J.uP(a.hi)
 x=a.An
 J.kZ(y,x,0,0,0,w,J.DO(x),m)
 P.Iw(new O.R5(a,b),null)},
 RF:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).ox("heapmap").ml(new O.aG(a)).OA(new O.aO()).wM(b)},"$1","gvC",2,0,15,65],
-nY:[function(a,b){P.Iw(new O.aq(a),null)},"$1","gR2",2,0,15,34],
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).wM(b)},"$1","gvC",2,0,17,82],
+nY:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,17,54],
 static:{"^":"nK,fM,SoT",pn:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
-w=$.Nd()
+w=$.XZ()
 v=P.YM(null,null,null,P.qU,W.I0)
 u=P.qU
 t=W.h4
@@ -9419,32 +9726,32 @@
 a.on=w
 a.BA=v
 a.LL=t
-C.pJ.ZL(a)
-C.pJ.XI(a)
+C.Cs.ZL(a)
+C.Cs.XI(a)
 return a}}},
-cda:{
+V3:{
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
-"^":"Xs:47;a,b",
+"^":"Tp:64;a,b",
 $0:function(){J.fi(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"Xs:97;a",
+"^":"Tp:113;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,96,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,112,"call"],
 $isEH:true},
 aO:{
-"^":"Xs:50;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,98,"call"],
+"^":"Tp:67;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,114,"call"],
 $isEH:true},
-aq:{
-"^":"Xs:47;a",
+oc:{
+"^":"Tp:64;a",
 $0:function(){J.vP(this.a)},
 $isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 Ly:{
-"^":"waa;GQ,J0,JS,GM,Rp,Ol,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V5;GQ,I8,JS,GM,Rp,Ol,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gLF:function(a){return a.Rp},
 sLF:function(a,b){a.Rp=this.ct(a,C.kG,a.Rp,b)},
 gB1:function(a){return a.Ol},
@@ -9454,17 +9761,17 @@
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
 y=P.L5(null,null,null,null,null)
 x=new G.qu(null,y)
-x.vR=P.zV(C.jN.t($.BY,"PieChart"),[z])
-a.J0=x
+x.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
+a.I8=x
 y.u(0,"title","New Space")
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
 x=P.L5(null,null,null,null,null)
 z=new G.qu(null,x)
-z.vR=P.zV(C.jN.t($.BY,"PieChart"),[y])
+z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
 a.GM=z
 x.u(0,"title","Old Space")
 this.z5(a)},
-hZ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+MQ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=a.Ol
 if(z==null||!J.x(J.UQ(z,"members")).$isWO||J.xC(J.q8(J.UQ(a.Ol,"members")),0))return
 a.Rp.B7()
@@ -9481,7 +9788,7 @@
 p=this.zh(a,y,8)
 J.Jr(a.Rp,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.II(a.Rp)
 z=a.GQ.Yb
-z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
+z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=a.GQ
 x=J.U6(o)
@@ -9489,21 +9796,21 @@
 z=z.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
-z.K9("addRow",[H.VM(new P.Tz(v),[null])])
+z.V7("addRow",[H.VM(new P.Tz(v),[null])])
 v=a.GQ
-z=J.xH(x.t(o,"capacity"),x.t(o,"used"))
+z=J.Hn(x.t(o,"capacity"),x.t(o,"used"))
 v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.K9("addRow",[H.VM(new P.Tz(w),[null])])
+v.V7("addRow",[H.VM(new P.Tz(w),[null])])
 w=a.GQ
 x=x.t(o,"external")
 w=w.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["External",x],P.En()))
-w.K9("addRow",[H.VM(new P.Tz(v),[null])])
+w.V7("addRow",[H.VM(new P.Tz(v),[null])])
 v=a.JS.Yb
-v.K9("removeRows",[0,v.nQ("getNumberOfRows")])
+v.V7("removeRows",[0,v.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"old")
 v=a.JS
 w=J.U6(o)
@@ -9511,29 +9818,29 @@
 v=v.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["Used",x],P.En()))
-v.K9("addRow",[H.VM(new P.Tz(z),[null])])
+v.V7("addRow",[H.VM(new P.Tz(z),[null])])
 z=a.JS
-v=J.xH(w.t(o,"capacity"),w.t(o,"used"))
+v=J.Hn(w.t(o,"capacity"),w.t(o,"used"))
 z=z.Yb
 x=[]
 C.Nm.FV(x,C.Nm.ez(["Free",v],P.En()))
-z.K9("addRow",[H.VM(new P.Tz(x),[null])])
+z.V7("addRow",[H.VM(new P.Tz(x),[null])])
 x=a.JS
 w=w.t(o,"external")
 x=x.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",w],P.En()))
-x.K9("addRow",[H.VM(new P.Tz(z),[null])])
+x.V7("addRow",[H.VM(new P.Tz(z),[null])])
 this.z5(a)},
-z5:function(a){var z=a.J0
+z5:function(a){var z=a.I8
 if(z==null)return
-z.Am(a.GQ)
-a.GM.Am(a.JS)},
-AE:[function(a,b,c,d){var z,y
+z.W2(a.GQ)
+a.GM.W2(a.JS)},
+BB:[function(a,b,c,d){var z,y
 if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
 if(z==null?y!=null:z!==y){a.Rp.sxp(y)
-J.II(a.Rp)}}},"$3","gQq",6,0,99,1,70,71],
+J.II(a.Rp)}}},"$3","gQq",6,0,115,1,87,88],
 K1:function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
@@ -9546,62 +9853,62 @@
 case 1:return J.UQ(J.UQ(b,"new"),7)
 case 2:return J.UQ(J.UQ(b,"new"),6)
 case 3:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5))
+return J.ew(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5))
 case 4:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4))
+return J.ew(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4))
 case 5:return J.UQ(J.UQ(b,"old"),7)
 case 6:return J.UQ(J.UQ(b,"old"),6)
 case 7:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
+return J.ew(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
 case 8:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.a9())},
+return J.ew(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.a9())},
 RF:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).ox("/allocationprofile").ml(new K.Rx(a)).OA(new K.RM()).wM(b)},"$1","gvC",2,0,15,65],
-QH:[function(a,b){var z=a.Ol
+J.aT(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).wM(b)},"$1","gvC",2,0,17,82],
+zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).ox("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).wM(b)},"$1","gyW",2,0,15,65],
+J.aT(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).wM(b)},"$1","gyW",2,0,17,82],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).ox("/allocationprofile?reset=true").ml(new K.ke(a)).OA(new K.xj()).wM(b)},"$1","gNb",2,0,15,65],
-pM:[function(a,b){var z,y,x,w
-try{this.hZ(a)}catch(x){w=H.Ru(x)
+J.aT(z).cv("/allocationprofile?reset=true").ml(new K.ke(a)).OA(new K.xj()).wM(b)},"$1","gNb",2,0,17,82],
+n1:[function(a,b){var z,y,x,w
+try{this.MQ(a)}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
+y=new H.XO(x,null)
 N.QM("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.DS,[],this.gJN(a))},"$1","gd0",2,0,15,34],
+this.ct(a,C.DS,[],this.gJN(a))},"$1","gd0",2,0,17,54],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.Sy(J.L9(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,100,101],
-NC:[function(a,b){var z,y
+return C.CD.Sy(J.L9(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,116,117],
+uW:[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"))},"$1","gJN",2,0,100,101],
-F9:[function(a,b){var z,y
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,116,117],
+Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.r0(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,100,101],
-Zy:function(a){var z=P.zV(C.jN.t($.BY,"DataTable"),null)
+return J.r0(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,116,117],
+Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
 a.GQ=new G.Kf(z)
-z.K9("addColumn",["string","Type"])
-a.GQ.Yb.K9("addColumn",["number","Size"])
-z=P.zV(C.jN.t($.BY,"DataTable"),null)
+z.V7("addColumn",["string","Type"])
+a.GQ.Yb.V7("addColumn",["number","Size"])
+z=P.zV(J.UQ($.BY,"DataTable"),null)
 a.JS=new G.Kf(z)
-z.K9("addColumn",["string","Type"])
-a.JS.Yb.K9("addColumn",["number","Size"])
+z.V7("addColumn",["string","Type"])
+a.JS.Yb.V7("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.Rp,new G.Vz([new G.YA("Class",G.Tp()),new G.YA("Accumulator Size (New)",G.Gt()),new G.YA("Accumulator (New)",G.xo()),new G.YA("Current Size (New)",G.Gt()),new G.YA("Current (New)",G.xo()),new G.YA("Accumulator Size (Old)",G.Gt()),new G.YA("Accumulator (Old)",G.xo()),new G.YA("Current Size (Old)",G.Gt()),new G.YA("Current (Old)",G.xo())],z,[],0,!0,null,null))
+z=this.ct(a,C.kG,a.Rp,new G.Vz([new G.zb("Class",G.HP()),new G.zb("Accumulator Size (New)",G.Fx()),new G.zb("Accumulator (New)",G.kh()),new G.zb("Current Size (New)",G.Fx()),new G.zb("Current (New)",G.kh()),new G.zb("Accumulator Size (Old)",G.Fx()),new G.zb("Accumulator (Old)",G.kh()),new G.zb("Current Size (Old)",G.Fx()),new G.zb("Current (Old)",G.kh())],z,[],0,!0,null,null))
 a.Rp=z
 z.sxp(1)},
-static:{"^":"IJv,bQj,kh,YU,r1K,d6,pC,DY2",le:function(a){var z,y,x,w
-z=$.Nd()
+static:{"^":"IJv,bQj,kf,wh,r1K,d6,pC,DY2",Ut:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9613,41 +9920,41 @@
 C.Vc.XI(a)
 C.Vc.Zy(a)
 return a}}},
-waa:{
+V5:{
 "^":"uL+Pi;",
 $isd3:true},
-Rx:{
-"^":"Xs:97;a",
+nx:{
+"^":"Tp:113;a",
 $1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,96,"call"],
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,112,"call"],
 $isEH:true},
-RM:{
-"^":"Xs:50;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,98,"call"],
+jm:{
+"^":"Tp:67;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,114,"call"],
 $isEH:true},
 AN:{
-"^":"Xs:97;a",
+"^":"Tp:113;a",
 $1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,96,"call"],
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,112,"call"],
 $isEH:true},
 Ao:{
-"^":"Xs:50;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,98,"call"],
+"^":"Tp:67;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,114,"call"],
 $isEH:true},
 ke:{
-"^":"Xs:97;a",
+"^":"Tp:113;a",
 $1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,96,"call"],
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,112,"call"],
 $isEH:true},
 xj:{
-"^":"Xs:50;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,98,"call"],
+"^":"Tp:67;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,114,"call"],
 $isEH:true}}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:function(a){var z,y
 z=[]
-y=new P.Kk(new P.wF([],z),new P.rG(z),new P.rM(z)).$1(a)
-new P.Qa().$0()
+y=new P.Kk(new P.wF([],z),new P.rG(z),new P.fh(z)).$1(a)
+new P.uS().$0()
 return y},
 o7:function(a,b){var z=[]
 return new P.xL(b,new P.CA([],z),new P.D6(z),new P.KC(z)).$1(a)},
@@ -9658,13 +9965,13 @@
 y.BYTES_PER_ELEMENT=1}return a}return new P.nl(a.data,a.height,a.width)},
 QO:function(a){if(!!J.x(a).$isnl)return{data:a.Rn,height:a.fg,width:a.R}
 return a},
-F7:function(){var z=$.PN
+F7:function(){var z=$.R6
 if(z==null){z=$.Qz
-if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
-$.Qz=z}z=z!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
-$.PN=z}return z},
+if(z==null){z=J.NT(window.navigator.userAgent,"Opera",0)
+$.Qz=z}z=z!==!0&&J.NT(window.navigator.userAgent,"WebKit",0)
+$.R6=z}return z},
 wF:{
-"^":"Xs:24;b,c",
+"^":"Tp:45;b,c",
 $1:function(a){var z,y,x
 z=this.b
 y=z.length
@@ -9674,23 +9981,23 @@
 return y},
 $isEH:true},
 rG:{
-"^":"Xs:102;d",
+"^":"Tp:118;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
-rM:{
-"^":"Xs:103;e",
+fh:{
+"^":"Tp:119;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
-Qa:{
-"^":"Xs:47;",
+uS:{
+"^":"Tp:64;",
 $0:function(){},
 $isEH:true},
 Kk:{
-"^":"Xs:30;f,UI,bK",
+"^":"Tp:10;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -9699,7 +10006,7 @@
 if(typeof a==="string")return a
 y=J.x(a)
 if(!!y.$isiP)return new Date(a.y3)
-if(!!y.$iswL)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$isKx)throw H.b(P.SY("structured clone of RegExp"))
 if(!!y.$ishH)return a
 if(!!y.$isO4)return a
 if(!!y.$isSg)return a
@@ -9724,11 +10031,11 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
 q1:{
-"^":"Xs:50;a,Gq",
+"^":"Tp:67;a,Gq",
 $2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
 $isEH:true},
 CA:{
-"^":"Xs:24;a,b",
+"^":"Tp:45;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -9738,19 +10045,19 @@
 return y},
 $isEH:true},
 D6:{
-"^":"Xs:102;c",
+"^":"Tp:118;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"Xs:103;d",
+"^":"Tp:119;d",
 $2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
 xL:{
-"^":"Xs:30;e,f,UI,bK",
+"^":"Tp:10;e,f,UI,bK",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -9790,9 +10097,12 @@
 return z},
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
-ez:[function(a,b){return this.lF().ez(0,b)},"$1","gIr",2,0,104,46],
-ev:function(a,b){return this.lF().ev(0,b)},
-Ft:[function(a,b){return this.lF().Ft(0,b)},"$1","git",2,0,105,46],
+ez:[function(a,b){var z=this.lF()
+return H.VM(new H.xy(z,b),[H.Kp(z,0),null])},"$1","gIr",2,0,120,28],
+ev:function(a,b){var z=this.lF()
+return H.VM(new H.U5(z,b),[H.Kp(z,0)])},
+Ft:[function(a,b){var z=this.lF()
+return H.VM(new H.zs(z,b),[H.Kp(z,0),null])},"$1","git",2,0,121,28],
 Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -9818,22 +10128,22 @@
 this.p5(z)
 return y},
 $isyN:true,
-$iscX:true,
-$ascX:function(){return[P.qU]}},
+$isQV:true,
+$asQV:function(){return[P.qU]}},
 Fe:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){return a.h(0,this.a)},
 $isEH:true},
 rl:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){return a.FV(0,this.a)},
 $isEH:true},
 uQ:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return a.V1(0)},
 $isEH:true},
 D7:{
-"^":"rm;NJ,iz",
+"^":"rm;Yn,iz",
 gye:function(){var z=this.iz
 return P.F(z.ev(z,new P.hT()),!0,W.h4)},
 aN:function(a,b){H.bQ(this.gye(),b)},
@@ -9854,12 +10164,12 @@
 vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){H.bQ(C.Nm.aM(this.gye(),b,c),new P.GS())},
 V1:function(a){J.r4(this.iz.NL)},
-aP:function(a,b,c){this.iz.aP(0,b,c)},
+xe:function(a,b,c){this.iz.xe(0,b,c)},
 UG:function(a,b,c){var z,y
 z=this.iz.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.Qk(z,c,y[b])},
+J.nt(z,c,y[b])},
 gB:function(a){return this.gye().length},
 t:function(a,b){var z=this.gye()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -9867,11 +10177,11 @@
 gA:function(a){var z=this.gye()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 GS:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.wp(a)},
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
@@ -9884,16 +10194,16 @@
 else if(J.xC(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.xC(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
 return Q.xI.prototype.gJp.call(this,a)},
-Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,47],
-SF:[function(a,b,c){var z,y
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,64],
+vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.LE(z).ml(new B.qB(a)).wM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gNe",4,0,106,107,65],
+c.$0()}},"$2","gNe",4,0,122,123,82],
 static:{lu:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9906,28 +10216,28 @@
 C.EL.XI(a)
 return a}}},
 qB:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
 a.szz(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.xP,z.tY,a)
-y.ct(z,C.xP,0,1)},"$1",null,2,0,null,93,"call"],
+y.ct(z,C.xP,0,1)},"$1",null,2,0,null,109,"call"],
 $isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":"V3;Xh,f2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V8;Xh,f2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 ghf:function(a){return a.Xh},
 shf:function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},
 gIi:function(a){return a.f2},
 sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
-vV:[function(a,b){return J.aT(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,66,67],
-S1:[function(a,b){return J.aT(a.Xh).ox(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,108,68],
-ee:[function(a,b){return J.aT(a.Xh).ox(J.WB(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,108,86],
-RF:[function(a,b){J.LE(a.Xh).wM(b)},"$1","gvC",2,0,15,65],
+vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,83,84],
+S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,124,85],
+ee:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,124,30],
+RF:[function(a,b){J.LE(a.Xh).wM(b)},"$1","gvC",2,0,17,82],
 static:{BN:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9935,25 +10245,25 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.yd.ZL(a)
-C.yd.XI(a)
+C.ry.ZL(a)
+C.ry.XI(a)
 return a}}},
-V3:{
+V8:{
 "^":"uL+Pi;",
 $isd3:true},
 cL:{
-"^":"Xs:94;a",
+"^":"Tp:110;a",
 $1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,60,"call"],
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,77,"call"],
 $isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
 "^":"",
 L4:{
-"^":"V5;PM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V10;PM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-RF:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,15,65],
+RF:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,17,82],
 static:{p4:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9961,19 +10271,34 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.wd.ZL(a)
-C.wd.XI(a)
+C.za.ZL(a)
+C.za.XI(a)
 return a}}},
-V5:{
+V10:{
 "^":"uL+Pi;",
 $isd3:true},
+Mb:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{pD:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.Ag.ZL(a)
+C.Ag.XI(a)
+return a}}},
 mO:{
-"^":"V8;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V11;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,15,65],
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,82],
 static:{Ch:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -9984,13 +10309,13 @@
 C.Ie.ZL(a)
 C.Ie.XI(a)
 return a}}},
-V8:{
+V11:{
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 static:{oB:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10003,11 +10328,11 @@
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V10;yR,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V12;yR,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-RF:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,15,65],
-TY:[function(a){J.LE(a.yR).wM(new E.XB(a))},"$0","gW6",0,0,13],
+RF:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,17,82],
+TY:[function(a){J.LE(a.yR).wM(new E.eG(a))},"$0","gW6",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
 a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.gW6(a))},
 Nz:function(a){var z
@@ -10016,7 +10341,7 @@
 if(z!=null){z.ed()
 a.mZ=null}},
 static:{hm:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10027,13 +10352,266 @@
 C.NK.ZL(a)
 C.NK.XI(a)
 return a}}},
-V10:{
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
-XB:{
-"^":"Xs:47;a",
+eG:{
+"^":"Tp:64;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+$isEH:true},
+qh:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{Sc:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.wK.ZL(a)
+C.wK.XI(a)
+return a}}},
+oF:{
+"^":"V13;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gjx:function(a){return a.Cr},
+sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,82],
+static:{J3z:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Tl.ZL(a)
+C.Tl.XI(a)
+return a}}},
+V13:{
+"^":"uL+Pi;",
+$isd3:true},
+Q6:{
+"^":"V14;uv,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gj4:function(a){return a.uv},
+sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
+RF:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,17,82],
+static:{chF:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.to.ZL(a)
+C.to.XI(a)
+return a}}},
+V14:{
+"^":"uL+Pi;",
+$isd3:true},
+uE:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{eg:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.Rr.ZL(a)
+C.Rr.XI(a)
+return a}}},
+Zn:{
+"^":"V15;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gjx:function(a){return a.Cr},
+sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,82],
+static:{xK:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.ij.ZL(a)
+C.ij.XI(a)
+return a}}},
+V15:{
+"^":"uL+Pi;",
+$isd3:true},
+n5:{
+"^":"V16;h1,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gHy:function(a){return a.h1},
+sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
+RF:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,17,82],
+static:{xx:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.aV.ZL(a)
+C.aV.XI(a)
+return a}}},
+V16:{
+"^":"uL+Pi;",
+$isd3:true},
+Ma:{
+"^":"V17;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gjx:function(a){return a.Cr},
+sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,82],
+static:{Ii:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.iR.ZL(a)
+C.iR.XI(a)
+return a}}},
+V17:{
+"^":"uL+Pi;",
+$isd3:true},
+wN:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{wZ7:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.RVQ.ZL(a)
+C.RVQ.XI(a)
+return a}}},
+ds:{
+"^":"V18;wT,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gMZ:function(a){return a.wT},
+sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
+RF:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,17,82],
+Yk:[function(a){J.LE(a.wT).wM(new E.Gf(a))},"$0","guT",0,0,15],
+q0:function(a){Z.uL.prototype.q0.call(this,a)
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.guT(a))},
+Nz:function(a){var z
+Z.uL.prototype.Nz.call(this,a)
+z=a.mZ
+if(z!=null){z.ed()
+a.mZ=null}},
+static:{pI:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.wP.ZL(a)
+C.wP.XI(a)
+return a}}},
+V18:{
+"^":"uL+Pi;",
+$isd3:true},
+Gf:{
+"^":"Tp:64;a",
+$0:[function(){var z=this.a
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+$isEH:true},
+ou:{
+"^":"V19;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gjx:function(a){return a.Cr},
+sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,82],
+static:{dv:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.lX.ZL(a)
+C.lX.XI(a)
+return a}}},
+V19:{
+"^":"uL+Pi;",
+$isd3:true},
+av:{
+"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gEQ:function(a){return a.CB},
+sEQ:function(a,b){a.CB=this.ct(a,C.fV,a.CB,b)},
+static:{R7:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.CB=!1
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.Wa.ZL(a)
+C.Wa.XI(a)
+return a}}},
+ZzR:{
+"^":"xI+Pi;",
+$isd3:true},
+uz:{
+"^":"V20;RX,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gNN:function(a){return a.RX},
+Fn:function(a){return this.gNN(a).$0()},
+sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
+RF:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,17,82],
+Yk:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","guT",0,0,15],
+q0:function(a){Z.uL.prototype.q0.call(this,a)
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.guT(a))},
+Nz:function(a){var z
+Z.uL.prototype.Nz.call(this,a)
+z=a.mZ
+if(z!=null){z.ed()
+a.mZ=null}},
+static:{fr:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.bZ.ZL(a)
+C.bZ.XI(a)
+return a}}},
+V20:{
+"^":"uL+Pi;",
+$isd3:true},
+Cc:{
+"^":"Tp:64;a",
+$0:[function(){var z=this.a
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
@@ -10044,13 +10622,13 @@
 y=J.UQ(z,"threshold")
 x=this.ks
 if(x.length>0)return
-for(w=this.H,v=J.mY(J.oe(w)),u=this.YK;v.G();){t=v.gl()
+for(w=this.H,v=J.mY(J.Mx(w)),u=this.YK;v.G();){t=v.gl()
 s=J.L9(t.gAv(),w.gAv())
 if(typeof y!=="number")return H.s(y)
 if(!(s>y||J.L9(J.on(t).gDu(),u.Av)>y))continue
 x.push(X.SJ(z,u,t,this))}},
 cO:function(){},
-Nh:function(){return J.q8(J.oe(this.H))>0},
+Nh:function(){return J.q8(J.Mx(this.H))>0},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
@@ -10059,7 +10637,7 @@
 if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
 if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(z.gAv(),this.YK.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
+this.ki=G.dj(z.gAv(),this.YK.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.wV)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
 else this.Zn=H.d(J.Iz(y.gtT(z)))+" (Function)"
 if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
@@ -10074,26 +10652,26 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V11;ix,fv,y7,MQ,Jy,Cv,zo,xO,XX,Kn,EX,Hm=,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V21;ix,fv,y7,hZ,Jy,Cv,zo,fJ,XX,VH,EX,Hm=,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gB1:function(a){return a.ix},
 sB1:function(a,b){a.ix=this.ct(a,C.vb,a.ix,b)},
 gPL:function(a){return a.fv},
 sPL:function(a,b){a.fv=this.ct(a,C.He,a.fv,b)},
 gLW:function(a){return a.y7},
 sLW:function(a,b){a.y7=this.ct(a,C.Gs,a.y7,b)},
-gUo:function(a){return a.MQ},
-sUo:function(a,b){a.MQ=this.ct(a,C.Dj,a.MQ,b)},
+gUo:function(a){return a.hZ},
+sUo:function(a,b){a.hZ=this.ct(a,C.Dj,a.hZ,b)},
 gEl:function(a){return a.Jy},
 sEl:function(a,b){a.Jy=this.ct(a,C.YD,a.Jy,b)},
 gnZ:function(a){return a.Cv},
 snZ:function(a,b){a.Cv=this.ct(a,C.bE,a.Cv,b)},
 gNG:function(a){return a.zo},
 sNG:function(a,b){a.zo=this.ct(a,C.aH,a.zo,b)},
-gQl:function(a){return a.xO},
-sQl:function(a,b){a.xO=this.ct(a,C.zz,a.xO,b)},
-gZA:function(a){return a.Kn},
-sZA:function(a,b){a.Kn=this.ct(a,C.TW,a.Kn,b)},
-pM:[function(a,b){var z,y,x,w,v
+gQl:function(a){return a.fJ},
+sQl:function(a,b){a.fJ=this.ct(a,C.zz,a.fJ,b)},
+gZA:function(a){return a.VH},
+sZA:function(a,b){a.VH=this.ct(a,C.TW,a.VH,b)},
+n1:[function(a,b){var z,y,x,w,v
 z=a.ix
 if(z==null)return
 y=J.UQ(z,"samples")
@@ -10102,7 +10680,7 @@
 z=J.AG(y)
 a.y7=this.ct(a,C.Gs,a.y7,z)
 z=x.bu(0)
-a.MQ=this.ct(a,C.Dj,a.MQ,z)
+a.hZ=this.ct(a,C.Dj,a.hZ,z)
 z=J.AG(J.UQ(a.ix,"depth"))
 a.Cv=this.ct(a,C.bE,a.Cv,z)
 w=J.UQ(a.ix,"period")
@@ -10110,19 +10688,19 @@
 z=C.CD.Sy(1000000/w,0)
 a.Jy=this.ct(a,C.YD,a.Jy,z)
 z=G.mG(J.UQ(a.ix,"timeSpan"))
-a.xO=this.ct(a,C.zz,a.xO,z)
+a.fJ=this.ct(a,C.zz,a.fJ,z)
 z=a.XX
-v=C.ON.bu(z*100)+"%"
+v=C.YI.bu(z*100)+"%"
 a.zo=this.ct(a,C.aH,a.zo,v)
 J.aT(a.ix).N3(a.ix)
 J.kW(a.ix,"threshold",z)
-this.Dq(a)},"$1","gd0",2,0,15,34],
+this.Dq(a)},"$1","gd0",2,0,17,54],
 q0:function(a){var z=R.tB([])
 a.Hm=new G.XN(z,null,null)
 this.Dq(a)},
-m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,15,34],
-RF:[function(a,b){var z="profile?tags="+H.d(a.Kn)
-J.aT(a.ix).ox(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,15,65],
+m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,17,54],
+RF:[function(a,b){var z="profile?tags="+H.d(a.VH)
+J.aT(a.ix).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,17,82],
 Dq:function(a){if(a.ix==null)return
 this.a8(a)},
 a8:function(a){var z,y,x,w,v,u,t
@@ -10136,59 +10714,56 @@
 v.C4(0)
 u.FV(w,v.ks)}catch(t){w=H.Ru(t)
 y=w
-x=new H.oP(t,null)
-N.QM("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,109,62],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,109,62],
-YF:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+x=new H.XO(t,null)
+N.QM("").xH("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.WT),1))a.Hm.qU(0)
+this.ct(a,C.ep,null,a.Hm)},
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,125,79],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,125,79],
+YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.F8(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$istV)try{w=a.Hm
 v=J.IO(z)
 if(typeof v!=="number")return v.W()
-u=w.WT
-t=J.U6(u)
-z=t.t(u,v-1)
-if(z.r8()===!0)t.UG(u,t.u8(u,z)+1,J.oe(z))
-else w.FS(z)}catch(s){w=H.Ru(s)
+w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.oP(s,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,99,1,70,71],
+x=new H.XO(u,null)
+N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,115,1,87,88],
 static:{"^":"B6",os:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.y7=""
-a.MQ=""
+a.hZ=""
 a.Jy=""
 a.Cv=""
 a.zo=""
-a.xO=""
+a.fJ=""
 a.XX=0.0002
-a.Kn="uv"
+a.VH="uv"
 a.EX="#tableTree"
 a.on=z
 a.BA=y
 a.LL=w
-C.bb.ZL(a)
-C.bb.XI(a)
+C.kS.ZL(a)
+C.kS.XI(a)
 return a}}},
-V11:{
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"Xs:97;a",
+"^":"Tp:113;a",
 $1:[function(a){var z=this.a
-z.ix=J.Q5(z,C.vb,z.ix,a)},"$1",null,2,0,null,110,"call"],
+z.ix=J.Q5(z,C.vb,z.ix,a)},"$1",null,2,0,null,126,"call"],
 $isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oa:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 static:{IB:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10202,11 +10777,11 @@
 return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 St:{
-"^":"V12;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V22;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{N5:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10214,20 +10789,20 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.nM.ZL(a)
-C.nM.XI(a)
+C.Hj.ZL(a)
+C.Hj.XI(a)
 return a}}},
-V12:{
+V22:{
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V13;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V23;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return a.ow.ox("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,111,81],
-jh:[function(a,b){return a.ow.ox("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,111,81],
+Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,127,11],
+jh:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,127,11],
 static:{dm:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10238,23 +10813,23 @@
 C.F2.ZL(a)
 C.F2.XI(a)
 return a}}},
-V13:{
+V23:{
 "^":"uL+Pi;",
 $isd3:true},
 GG:{
-"^":"Xs:30;a",
-$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,93,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,109,"call"],
 $isEH:true},
 r8:{
-"^":"Xs:30;a",
-$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,93,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,109,"call"],
 $isEH:true},
 Qh:{
-"^":"V14;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V24;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{Qj:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10262,18 +10837,18 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.rC.ZL(a)
-C.rC.XI(a)
+C.kd.ZL(a)
+C.kd.XI(a)
 return a}}},
-V14:{
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V15;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V25;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{RP:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10284,15 +10859,15 @@
 C.Ji.ZL(a)
 C.Ji.XI(a)
 return a}}},
-V15:{
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 vT:{
 "^":"a;Y0,WL",
 eC:function(a){var z,y,x,w,v,u
 z=this.Y0.Yb
-if(J.xC(z.nQ("getNumberOfColumns"),0)){z.K9("addColumn",["string","Name"])
-z.K9("addColumn",["number","Value"])}z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
+if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
+z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 for(y=J.mY(a.gvc()),x=J.U6(a);y.G();){w=y.gl()
 v=J.uH(x.t(a,w),"%")
 if(0>=v.length)return H.e(v,0)
@@ -10300,25 +10875,25 @@
 C.Nm.FV(u,C.Nm.ez([w,H.RR(v[0],null)],P.En()))
 u=new P.Tz(u)
 u.$builtinTypeInfo=[null]
-z.K9("addRow",[u])}}},
-Mc:{
-"^":"V16;wd,hG,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gKE:function(a){return a.wd},
-sKE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
-ak:[function(a,b){var z,y,x
+z.V7("addRow",[u])}}},
+YA:{
+"^":"V26;wd,iF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gXE:function(a){return a.wd},
+sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
+ci:[function(a,b){var z,y,x
 if(a.wd==null)return
-if($.Ib().MM.Gv!==0&&a.hG==null)a.hG=new D.vT(new G.Kf(P.zV(C.jN.t($.BY,"DataTable"),null)),null)
-z=a.hG
+if($.Ib().MM.Gv!==0&&a.iF==null)a.iF=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
+z=a.iF
 if(z==null)return
 z.eC(a.wd)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
-if(y!=null){z=a.hG
+if(y!=null){z=a.iF
 x=z.WL
 if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
-x.vR=P.zV(C.jN.t($.BY,"PieChart"),[y])
-z.WL=x}x.Am(z.Y0)}},"$1","gZm",2,0,15,34],
+x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
+z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,17,54],
 static:{BP:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10329,126 +10904,126 @@
 C.wQ.ZL(a)
 C.wQ.XI(a)
 return a}}},
-V16:{
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
-Lr:{
-"^":"a;Xr,Z5",
+EN:{
+"^":"a;X6,YT",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.Xr.Yb
-if(J.xC(z.nQ("getNumberOfColumns"),0)){z.K9("addColumn",["string","Time"])
+z=this.X6.Yb
+if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
 for(y=J.mY(a.gaf());y.G();){x=y.lo
 if(J.xC(x,"Idle"))continue
-z.K9("addColumn",["number",x])}}z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
+z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 w=J.UU(a.gaf(),"Idle")
 v=a.gij()
-for(u=0;u<a.glI().length;++u){y=a.glI()
+for(u=0;u<a.gFw().length;++u){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 t=y[u].SP
 s=[]
 if(t>0){if(typeof v!=="number")return H.s(v)
 s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 r=y[u].wZ
 if(r===0){q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].KE.length))break
+if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].KE.length))break
+if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
-y=y[u].KE
+y=y[u].XE
 if(q>=y.length)return H.e(y,q)
 s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
 C.Nm.FV(y,C.Nm.ez(s,P.En()))
 y=new P.Tz(y)
 y.$builtinTypeInfo=[null]
-z.K9("addRow",[y])}}},
+z.V7("addRow",[y])}}},
 qk:{
-"^":"V17;px,ii,LR,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-god:function(a){return a.px},
-sod:function(a,b){a.px=this.ct(a,C.rB,a.px,b)},
-vV:[function(a,b){var z=a.px
-return z.ox(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,66,67],
-MJ:[function(a){a.px.m7().ml(new L.LX(a))},"$0","gPW",0,0,13],
+"^":"V27;ck,ts,LR,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+god:function(a){return a.ck},
+sod:function(a,b){a.ck=this.ct(a,C.rB,a.ck,b)},
+vV:[function(a,b){var z=a.ck
+return z.cv(J.ew(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,83,84],
+Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
-a.ii=P.ww(P.ii(0,0,0,0,0,1),this.gPW(a))},
+a.ts=P.ww(P.ii(0,0,0,0,0,1),this.gJD(a))},
 Nz:function(a){var z
 Z.uL.prototype.Nz.call(this,a)
-z=a.ii
+z=a.ts
 if(z!=null)z.ed()},
-RF:[function(a,b){J.LE(a.px).wM(b)},"$1","gvC",2,0,15,65],
-Fv:[function(a,b){return a.px.ox("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,111,81],
-jh:[function(a,b){return a.px.ox("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,111,81],
+RF:[function(a,b){J.LE(a.ck).wM(b)},"$1","gvC",2,0,17,82],
+Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,127,11],
+jh:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,127,11],
 static:{KM:function(a){var z,y,x,w,v
-z=P.zV(C.jN.t($.BY,"DataTable"),null)
-y=$.Nd()
+z=P.zV(J.UQ($.BY,"DataTable"),null)
+y=$.XZ()
 x=P.YM(null,null,null,P.qU,W.I0)
 w=P.qU
 v=W.h4
 v=H.VM(new V.qC(P.YM(null,null,null,w,v),null,null),[w,v])
-a.LR=new L.Lr(new G.Kf(z),null)
+a.LR=new L.EN(new G.Kf(z),null)
 a.on=y
 a.BA=x
 a.LL=v
-C.BJ.ZL(a)
-C.BJ.XI(a)
+C.Xe.ZL(a)
+C.Xe.XI(a)
 return a}}},
-V17:{
+V27:{
 "^":"uL+Pi;",
 $isd3:true},
 LX:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 y=z.LR
 y.eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
-if(x!=null){if(y.Z5==null){w=P.L5(null,null,null,null,null)
+if(x!=null){if(y.YT==null){w=P.L5(null,null,null,null,null)
 v=new G.qu(null,w)
-v.vR=P.zV(C.jN.t($.BY,"SteppedAreaChart"),[x])
-y.Z5=v
+v.vR=P.zV(J.UQ($.BY,"SteppedAreaChart"),[x])
+y.YT=v
 w.u(0,"isStacked",!0)
-y.Z5.bG.u(0,"connectSteps",!1)
-y.Z5.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.Z5.Am(y.Xr)}z.ii=P.ww(P.ii(0,0,0,0,0,1),J.yo(z))},"$1",null,2,0,null,112,"call"],
+y.YT.bG.u(0,"connectSteps",!1)
+y.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.YT.W2(y.X6)}z.ts=P.ww(P.ii(0,0,0,0,0,1),J.dq(z))},"$1",null,2,0,null,128,"call"],
 $isEH:true},
 CV:{
-"^":"Xs:30;a",
-$1:[function(a){return J.LE(this.a.px)},"$1",null,2,0,null,93,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,109,"call"],
 $isEH:true},
 Vq:{
-"^":"Xs:30;a",
-$1:[function(a){return J.LE(this.a.px)},"$1",null,2,0,null,93,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,109,"call"],
 $isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 xh:{
-"^":"a;hw,jc",
-KN:function(a,b){var z,y,x,w,v,u,t,s
-z=this.jc
+"^":"a;ue,GO",
+LE:function(a,b){var z,y,x,w,v,u,t,s
+z=this.GO
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.mY(a.gvc()),x=this.hw,w=J.U6(a),v=b+1;y.G();){u=y.gl()
+for(y=J.mY(a.gvc()),x=this.ue,w=J.U6(a),v=b+1;y.G();){u=y.gl()
 t=w.t(a,u)
 s=J.x(t)
 if(!!s.$isZ0){s=C.xB.U("  ",b)
 x.vM+=s
 s="\""+H.d(u)+"\": {\n"
 x.vM+=s
-this.KN(t,v)
+this.LE(t,v)
 s=C.xB.U("  ",b)
 s=x.vM+=s
 x.vM=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
 x.vM+=s
 s="\""+H.d(u)+"\": [\n"
 x.vM+=s
-this.HC(t,v)
+this.QC(t,v)
 s=C.xB.U("  ",b)
 s=x.vM+=s
 x.vM=s+"]\n"}else{s=C.xB.U("  ",b)
@@ -10456,22 +11031,22 @@
 s="\""+H.d(u)+"\": "+H.d(t)
 s=x.vM+=s
 x.vM=s+"\n"}}z.Rz(0,a)},
-HC:function(a,b){var z,y,x,w,v,u
-z=this.jc
+QC:function(a,b){var z,y,x,w,v,u
+z=this.GO
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.mY(a),x=this.hw,w=b+1;y.G();){v=y.gl()
+for(y=J.mY(a),x=this.ue,w=b+1;y.G();){v=y.gl()
 u=J.x(v)
 if(!!u.$isZ0){u=C.xB.U("  ",b)
 u=x.vM+=u
 x.vM=u+"{\n"
-this.KN(v,w)
+this.LE(v,w)
 u=C.xB.U("  ",b)
 u=x.vM+=u
 x.vM=u+"}\n"}else if(!!u.$isWO){u=C.xB.U("  ",b)
 u=x.vM+=u
 x.vM=u+"[\n"
-this.HC(v,w)
+this.QC(v,w)
 u=C.xB.U("  ",b)
 u=x.vM+=u
 x.vM=u+"]\n"}else{u=C.xB.U("  ",b)
@@ -10479,24 +11054,24 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V18;OZ,X7,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gIr:function(a){return a.OZ},
+"^":"V28;Ly,cs,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:function(a,b){a.OZ=this.ct(a,C.SR,a.OZ,b)},
-glp:function(a){return a.X7},
-slp:function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},
+sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
+glp:function(a){return a.cs},
+slp:function(a,b){a.cs=this.ct(a,C.t6,a.cs,b)},
 oC:[function(a,b){var z,y,x
 z=P.p9("")
 y=P.Ls(null,null,null,null)
-x=a.OZ
+x=a.Ly
 z.vM=""
 z.KF("{\n")
-new Z.xh(z,y).KN(x,0)
+new Z.xh(z,y).LE(x,0)
 z.KF("}\n")
 z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gdB",2,0,15,34],
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,17,54],
 static:{M7:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10507,14 +11082,14 @@
 C.Yt.ZL(a)
 C.Yt.XI(a)
 return a}}},
-V18:{
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 static:{rA:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10528,13 +11103,13 @@
 return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 CX:{
-"^":"V19;iI,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V29;iI,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).ox(J.WB(J.F8(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,66,67],
-RF:[function(a,b){J.LE(a.iI).wM(b)},"$1","gvC",2,0,15,65],
+vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.F8(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,83,84],
+RF:[function(a,b){J.LE(a.iI).wM(b)},"$1","gvC",2,0,17,82],
 static:{as:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10545,22 +11120,28 @@
 C.MG.ZL(a)
 C.MG.XI(a)
 return a}}},
-V19:{
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
-JM:{
+Rw:{
 "^":"a;oc>,eT>,n2,Cj>,ks>,Gs",
 gB8:function(){var z,y,x
 z=this.eT
-y=z==null||J.xC(J.tE(z),"")
+y=z==null||J.xC(J.O6(z),"")
 x=this.oc
 return y?x:z.gB8()+"."+x},
-gQG:function(){if($.RL){var z=this.eT
-if(z!=null)return z.gQG()}return $.Y4},
-Im:function(a){return a.P>=this.gQG().P},
+gOR:function(){if($.RL){var z=this.n2
+if(z!=null)return z
+z=this.eT
+if(z!=null)return z.gOR()}return $.Y4},
+sOR:function(a){if($.RL&&this.eT!=null)this.n2=a
+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},
 Y6:function(a,b,c,d){var z,y,x,w,v
-if(a.P>=this.gQG().P){z=this.gB8()
+if(a.P>=this.gOR().P){z=this.gB8()
 y=new P.iP(Date.now(),!1)
 y.EK()
 x=$.Y1
@@ -10570,7 +11151,7 @@
 v=J.Lp(v)}else N.QM("").cB(w)}},
 X2:function(a,b,c){return this.Y6(C.Ab,a,b,c)},
 x9:function(a){return this.X2(a,null,null)},
-dL:function(a,b,c){return this.Y6(C.eI,a,b,c)},
+dL:function(a,b,c){return this.Y6(C.t4,a,b,c)},
 J4:function(a){return this.dL(a,null,null)},
 ZW:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.ZW(a,null,null)},
@@ -10578,21 +11159,27 @@
 j2:function(a){return this.xH(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.Xm,a,b,c)},
 YX:function(a){return this.WB(a,null,null)},
-cB:function(a){},
+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.QM("").IE()},
+cB:function(a){var z=this.Gs
+if(z!=null){if(z.Gv>=4)H.vh(z.q7())
+z.Iv(a)}},
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
-$isJM:true,
-static:{"^":"Uj",QM:function(a){return $.R2().to(a,new N.dG(a))}}},
+$isRw:true,
+static:{"^":"Uj",QM:function(a){return $.Iu().to(a,new N.dG(a))}}},
 dG:{
-"^":"Xs:47;a",
+"^":"Tp:64;a",
 $0:function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
 y=C.xB.cn(z,".")
 if(y===-1)x=z!==""?N.QM(""):null
 else{x=N.QM(C.xB.Nj(z,0,y))
-z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.JM)
-v=new N.JM(z,x,null,w,H.VM(new Q.A2(w),[null,null]),null)
+z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.Rw)
+v=new N.Rw(z,x,null,w,H.VM(new Q.Gj(w),[null,null]),null)
 v.QL(z,x,w)
 return v},
 $isEH:true},
@@ -10618,18 +11205,43 @@
 giO:function(a){return this.P},
 bu:function(a){return this.oc},
 $isqV:true,
-static:{"^":"X9,tmj,Enk,LkO,tY,Fn,dc,zE,Uu,lM,uxc"}},
+static:{"^":"X9,tmj,Enk,LkO,tY,Fn,dc,zE,Uu,lDu,uxc"}},
 HV:{
-"^":"a;QG<,G1>,Mw,Fl,O0,kc>,I4<",
-bu:function(a){return"["+this.QG.oc+"] "+this.Mw+": "+this.G1},
-static:{"^":"Y1"}}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
+"^":"a;OR<,G1>,Mw,Fl<,O0,kc>,I4<",
+bu:function(a){return"["+this.OR.oc+"] "+this.Mw+": "+this.G1},
+$isHV:true,
+static:{"^":"Y1"}}}],["","main.dart",,F,{
+"^":"",
+E2:function(){var z,y
+N.QM("").sOR(C.IF)
+N.QM("").gSZ().yI(new F.e377())
+N.QM("").To("Starting Observatory")
+N.QM("").To("Loading Google Charts API")
+z=J.UQ($.ca(),"google")
+y=$.Ib()
+z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
+$.Ib().MM.ml(G.vN()).ml(new F.e378())},
+e377:{
+"^":"Tp:130;",
+$1:[function(a){var z
+if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
+if(J.co(z.gG1(a),"Error evaluating expression"))z=J.x5(z.gG1(a),"Can't assign to null: ")===!0||J.x5(z.gG1(a),"Expression is not assignable: ")===!0
+else z=!1}else z=!1
+if(z)return
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,129,"call"],
+$isEH:true},
+e378:{
+"^":"Tp:10;",
+$1:[function(a){N.QM("").To("Initializing Polymer")
+A.YK()},"$1",null,2,0,null,11,"call"],
+$isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 md:{
-"^":"V20;i4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V30;i4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
-static:{aD:function(a){var z,y,x,w
-z=$.Nd()
+static:{DCi:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10641,43 +11253,43 @@
 C.kD.ZL(a)
 C.kD.XI(a)
 return a}}},
-V20:{
+V30:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V21;KU,V4,fc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V31;KU,V4,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
 sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-grZ:function(a){return a.fc},
-srZ:function(a,b){a.fc=this.ct(a,C.uk,a.fc,b)},
+grZ:function(a){return a.Jo},
+srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{yU:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.KU="#"
 a.V4="---"
-a.fc=!1
+a.Jo=!1
 a.on=z
 a.BA=y
 a.LL=w
 C.SU.ZL(a)
 C.SU.XI(a)
 return a}}},
-V21:{
+V31:{
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V22;KU,V4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V32;KU,V4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
 sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
 static:{JR:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10690,31 +11302,31 @@
 C.nn.ZL(a)
 C.nn.XI(a)
 return a}}},
-V22:{
+V32:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V23;rU,cj,z2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V33;rU,SB,z2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gFR:function(a){return a.rU},
-LY:function(a,b){return this.gFR(a).$1(b)},
 Ki:function(a){return this.gFR(a).$0()},
+LY:function(a,b){return this.gFR(a).$1(b)},
 sFR:function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},
-gjl:function(a){return a.cj},
-sjl:function(a,b){a.cj=this.ct(a,C.aP,a.cj,b)},
+gjl:function(a){return a.SB},
+sjl:function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},
 gph:function(a){return a.z2},
 sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
-Ty:[function(a,b,c,d){var z=a.cj
+Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
-a.cj=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gzY",6,0,69,1,70,71],
-rT:[function(a){a.cj=this.ct(a,C.aP,a.cj,!1)},"$0","gCB",0,0,13],
+a.SB=this.ct(a,C.aP,z,!0)
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,86,1,87,88],
+rT:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,15],
 static:{ZC:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.cj=!1
+a.SB=!1
 a.z2="Refresh"
 a.on=z
 a.BA=y
@@ -10722,103 +11334,103 @@
 C.J7.ZL(a)
 C.J7.XI(a)
 return a}}},
-V23:{
+V33:{
 "^":"uL+Pi;",
 $isd3:true},
 G1:{
-"^":"V24;fc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-grZ:function(a){return a.fc},
-srZ:function(a,b){a.fc=this.ct(a,C.uk,a.fc,b)},
+"^":"V34;Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+grZ:function(a){return a.Jo},
+srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{J8:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.fc=!1
+a.Jo=!1
 a.on=z
 a.BA=y
 a.LL=w
 C.lx.ZL(a)
 C.lx.XI(a)
 return a}}},
-V24:{
+V34:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V25;fc,iy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-grZ:function(a){return a.fc},
-srZ:function(a,b){a.fc=this.ct(a,C.uk,a.fc,b)},
+"^":"V35;Jo,iy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+grZ:function(a){return a.Jo},
+srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-Wt:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,15,34],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,17,54],
 gu6:function(a){var z=a.iy
 if(z!=null)return z.gHP()
 else return""},
 su6:function(a,b){},
-static:{Du:function(a){var z,y,x,w
-z=$.Nd()
+static:{zf:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.fc=!1
+a.Jo=!1
 a.on=z
 a.BA=y
 a.LL=w
 C.uF.ZL(a)
 C.uF.XI(a)
 return a}}},
-V25:{
+V35:{
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V26;jq,fc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gHt:function(a){return a.jq},
-sHt:function(a,b){a.jq=this.ct(a,C.EV,a.jq,b)},
-grZ:function(a){return a.fc},
-srZ:function(a,b){a.fc=this.ct(a,C.uk,a.fc,b)},
+"^":"V36;VW,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gHt:function(a){return a.VW},
+sHt:function(a,b){a.VW=this.ct(a,C.EV,a.VW,b)},
+grZ:function(a){return a.Jo},
+srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{JT:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.fc=!1
+a.Jo=!1
 a.on=z
 a.BA=y
 a.LL=w
 C.ct.ZL(a)
 C.ct.XI(a)
 return a}}},
-V26:{
+V36:{
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V27;Au,fc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V37;Au,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
-grZ:function(a){return a.fc},
-srZ:function(a,b){a.fc=this.ct(a,C.uk,a.fc,b)},
+grZ:function(a){return a.Jo},
+srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{GO:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.fc=!1
+a.Jo=!1
 a.on=z
 a.BA=y
 a.LL=w
 C.HR.ZL(a)
 C.HR.XI(a)
 return a}}},
-V27:{
+V37:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 F1:{
-"^":"V28;qC,yT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V38;qC,yT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gzj:function(a){return a.qC},
 szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
 giJ:function(a){return a.yT},
@@ -10826,18 +11438,18 @@
 q0:function(a){var z
 Z.uL.prototype.q0.call(this,a)
 if(a.qC===!0){z=new U.bl(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
-z.Lw()
+z.md()
 z.PI()
-z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
+z=new G.mL(new G.hq(null,"",null,null),z,null,null,null,null,null)
 z.hq()
-a.yT=this.ct(a,C.j2,a.yT,z)}else{z=new U.Fk(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
-z.Lw()
+a.yT=this.ct(a,C.j2,a.yT,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+z.md()
 z.SC()
-z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
+z=new G.mL(new G.hq(null,"",null,null),z,null,null,null,null,null)
 z.US()
 a.yT=this.ct(a,C.j2,a.yT,z)}},
-static:{VO:function(a){var z,y,x,w
-z=$.Nd()
+static:{Lu:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10849,7 +11461,7 @@
 C.k0.ZL(a)
 C.k0.XI(a)
 return a}}},
-V28:{
+V38:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
@@ -10859,22 +11471,22 @@
 Nz:function(a){A.dM.prototype.Nz.call(this,a)},
 I9:function(a){A.dM.prototype.I9.call(this,a)},
 wN:function(a,b,c,d){A.dM.prototype.wN.call(this,a,b,c,d)},
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,113,114],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,10,11],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,115,116],
-i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,115,116],
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,131,132],
+Ze:[function(a,b){return G.Ef(b)},"$1","gbJ",2,0,12,13],
+uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,133,134],
+i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,133,134],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,115,116],
-Qr:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,115,116],
-ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,115,116],
-fZ:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,115,116],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,115,116],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,133,134],
+Qr:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,133,134],
+ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,133,134],
+fZ:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,133,134],
+JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,133,134],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,115,116],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,115,116],
-SG:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,115,116],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,133,134],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,133,134],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,133,134],
 static:{EE:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -10882,8 +11494,8 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.Pf.ZL(a)
-C.Pf.XI(a)
+C.mk.ZL(a)
+C.mk.XI(a)
 return a}}}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
 "^":"",
 Ap:{
@@ -10898,23 +11510,23 @@
 z=P.bK(this.gym(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gcm",0,0,13],
-NB:[function(a){a.AP=null},"$0","gym",0,0,13],
-BN:[function(a){var z,y,x
+k0:[function(a){},"$0","gcm",0,0,15],
+NB:[function(a){a.AP=null},"$0","gym",0,0,15],
+HC:[function(a){var z,y,x
 z=a.fn
 a.fn=null
 if(this.gnz(a)&&z!=null){y=a.AP
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,76],
+return!0}return!1},"$0","gDx",0,0,94],
 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)},
-SZ:function(a,b){if(!this.gnz(a))return
+nq:function(a,b){if(!this.gnz(a))return
 if(a.fn==null){a.fn=[]
 P.rb(this.gDx(a))}a.fn.push(b)},
 $isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
@@ -10927,7 +11539,7 @@
 bu:function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
 $isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
-N0:function(){var z,y,x,w,v,u,t,s,r,q
+wR:function(){var z,y,x,w,v,u,t,s,r,q
 if($.AM)return
 if($.iq==null)return
 $.AM=!0
@@ -10942,18 +11554,54 @@
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
 s=t.R9
 s=s.iE!==s
-if(s){if(t.BN(0)){if(w)y.push([u,t])
+if(s){if(t.HC(0)){if(w)y.push([u,t])
 v=!0}$.iq.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.T5()
+if(w&&v){w=$.eI()
 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();){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))+".")}}$.ax=$.iq.length
-$.AM=!1}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
+$.AM=!1},
+Ht:function(){var z={}
+z.a=!1
+z=new O.Nq(z)
+return new P.yQ(null,null,null,null,new O.u3(z),new O.bF(z),null,null,null,null,null,null)},
+Nq:{
+"^":"Tp:135;a",
+$2:function(a,b){var z=this.a
+if(z.a)return
+z.a=!0
+a.RK(b,new O.c1(z))},
+$isEH:true},
+c1:{
+"^":"Tp:64;a",
+$0:[function(){this.a.a=!1
+O.wR()},"$0",null,0,0,null,"call"],
+$isEH:true},
+u3:{
+"^":"Tp:27;b",
+$4:[function(a,b,c,d){if(d==null)return d
+return new O.yJ(this.b,b,c,d)},"$4",null,8,0,null,24,25,26,28,"call"],
+$isEH:true},
+yJ:{
+"^":"Tp:64;c,d,e,f",
+$0:[function(){this.c.$2(this.d,this.e)
+return this.f.$0()},"$0",null,0,0,null,"call"],
+$isEH:true},
+bF:{
+"^":"Tp:136;UI",
+$4:[function(a,b,c,d){if(d==null)return d
+return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,24,25,26,28,"call"],
+$isEH:true},
+f6:{
+"^":"Tp:10;bK,Gq,Rm,w3",
+$1:[function(a){this.bK.$2(this.Gq,this.Rm)
+return this.w3.$1(a)},"$1",null,2,0,null,137,"call"],
+$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
 B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=f-e+1
-y=J.WB(J.xH(c,b),1)
+y=J.ew(J.Hn(c,b),1)
 x=Array(z)
 for(w=x.length,v=0;v<z;++v){if(typeof y!=="number")return H.s(y)
 u=Array(y)
@@ -10966,7 +11614,7 @@
 u=x[0]
 if(t>=u.length)return H.e(u,t)
 u[t]=t}for(u=J.Qc(b),s=J.U6(a),v=1;v<z;++v)for(r=v-1,q=e+v-1,t=1;t<y;++t){if(q>>>0!==q||q>=d.length)return H.e(d,q)
-p=J.xC(d[q],s.t(a,J.xH(u.g(b,t),1)))
+p=J.xC(d[q],s.t(a,J.Hn(u.g(b,t),1)))
 o=x[v]
 n=x[r]
 m=t-1
@@ -11063,13 +11711,13 @@
 q=[]
 q.$builtinTypeInfo=[G.DA]
 for(p=e,o=b,t=null,n=0;n<r.length;++n)switch(r[n]){case 0:if(t!=null){q.push(t)
-t=null}o=J.WB(o,1);++p
+t=null}o=J.ew(o,1);++p
 break
 case 1:if(t==null){u=[]
 z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.dM=J.WB(t.dM,1)
-o=J.WB(o,1)
+t=new G.DA(a,z,u,o,0)}t.dM=J.ew(t.dM,1)
+o=J.ew(o,1)
 z=t.Il
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
 J.bi(z,d[p]);++p
@@ -11077,8 +11725,8 @@
 case 2:if(t==null){u=[]
 z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.dM=J.WB(t.dM,1)
-o=J.WB(o,1)
+t=new G.DA(a,z,u,o,0)}t.dM=J.ew(t.dM,1)
+o=J.ew(o,1)
 break
 case 3:if(t==null){u=[]
 z=new P.Yp(u)
@@ -11092,7 +11740,7 @@
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
-x=J.qA(b.gIl())
+x=J.Nd(b.gIl())
 w=b.gNg()
 if(w==null)w=0
 v=new P.Yp(x)
@@ -11100,33 +11748,33 @@
 u=new G.DA(y,v,x,z,w)
 for(t=!1,s=0,r=0;z=a.length,r<z;++r){if(r<0)return H.e(a,r)
 q=a[r]
-q.jr=J.WB(q.jr,s)
+q.jr=J.ew(q.jr,s)
 if(t)continue
 z=u.jr
-y=J.WB(z,u.Uj.G4.length)
+y=J.ew(z,u.Uj.G4.length)
 x=q.jr
-p=P.J(y,J.WB(x,q.dM))-P.y(z,x)
+p=P.J(y,J.ew(x,q.dM))-P.y(z,x)
 if(p>=0){C.Nm.W4(a,r);--r
-z=J.xH(q.dM,q.Uj.G4.length)
+z=J.Hn(q.dM,q.Uj.G4.length)
 if(typeof z!=="number")return H.s(z)
 s-=z
-z=J.WB(u.dM,J.xH(q.dM,p))
+z=J.ew(u.dM,J.Hn(q.dM,p))
 u.dM=z
 y=u.Uj.G4.length
 x=q.Uj.G4.length
 if(J.xC(z,0)&&y+x-p===0)t=!0
 else{o=q.Il
 if(J.u6(u.jr,q.jr)){z=u.Uj
-z=z.Mu(z,0,J.xH(q.jr,u.jr))
+z=z.Mu(z,0,J.Hn(q.jr,u.jr))
 o.toString
 if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
-H.IC(o,0,z)}if(J.xZ(J.WB(u.jr,u.Uj.G4.length),J.WB(q.jr,q.dM))){z=u.Uj
-J.bj(o,z.Mu(z,J.xH(J.WB(q.jr,q.dM),u.jr),u.Uj.G4.length))}u.Il=o
+H.IC(o,0,z)}if(J.z8(J.ew(u.jr,u.Uj.G4.length),J.ew(q.jr,q.dM))){z=u.Uj
+J.bj(o,z.Mu(z,J.Hn(J.ew(q.jr,q.dM),u.jr),u.Uj.G4.length))}u.Il=o
 u.Uj=q.Uj
 if(J.u6(q.jr,u.jr))u.jr=q.jr
-t=!1}}else if(J.u6(u.jr,q.jr)){C.Nm.aP(a,r,u);++r
-n=J.xH(u.dM,u.Uj.G4.length)
-q.jr=J.WB(q.jr,n)
+t=!1}}else if(J.u6(u.jr,q.jr)){C.Nm.xe(a,r,u);++r
+n=J.Hn(u.dM,u.Uj.G4.length)
+q.jr=J.ew(q.jr,n)
 if(typeof n!=="number")return H.s(n)
 s+=n
 t=!0}else t=!1}if(!t)a.push(u)},
@@ -11137,7 +11785,7 @@
 Qi:function(a,b){var z,y,x,w,v,u
 if(b.length<=1)return b
 z=[]
-for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.Jo;y.G();){w=y.lo
+for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
 if(J.xC(w.gNg(),1)&&w.gRt().G4.length===1){v=w.gRt().G4
 if(0>=v.length)return H.e(v,0)
 v=v[0]
@@ -11145,7 +11793,7 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.xC(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,w.gRt().G4.length))}return z},
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.ew(v.gvH(w),w.gNg()),w.gIl(),0,w.gRt().G4.length))}return z},
 DA:{
 "^":"a;WA>,Uj,Il<,jr,dM",
 gvH:function(a){return this.jr},
@@ -11169,13 +11817,13 @@
 "^":"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.xC(c,d))z.SZ(a,H.VM(new T.qI(a,b,c,d),[null]))
+if(z.gnz(a)&&!J.xC(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
 return d},
 d3:{
 "^":"a;",
 $isd3:true},
-ic:{
-"^":"Xs:50;a,b",
+X6:{
+"^":"Tp:67;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
 y=$.cp().jD(z,a)
@@ -11188,21 +11836,21 @@
 z.V2.u(0,a,y)}},
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
-iR:{
+Sk:{
 "^":"Pi;",
 gP:function(a){return this.u1},
-sP:function(a,b){this.u1=F.Wi(this,C.YI,this.u1,b)},
+sP:function(a,b){this.u1=F.Wi(this,C.zdr,this.u1,b)},
 bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.u1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
-"^":"uFU;ID@,IO,Jo,AP,fn",
-gRT:function(){var z=this.IO
+"^":"uFU;b3@,iT,ao,AP,fn",
+gRT:function(){var z=this.iT
 if(z==null){z=P.bK(new Q.cj(this),null,!0,null)
-this.IO=z}z.toString
+this.iT=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:function(a){return this.Jo.length},
+gB:function(a){return this.ao.length},
 sB:function(a,b){var z,y,x,w,v
-z=this.Jo
+z=this.ao
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -11210,7 +11858,7 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.IO
+x=this.iT
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)if(b<y){if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
@@ -11223,63 +11871,63 @@
 x=x.br(0)
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.b4(new G.DA(this,w,x,b,0))}else{v=[]
+this.iH(new G.DA(this,w,x,b,0))}else{v=[]
 x=new P.Yp(v)
 x.$builtinTypeInfo=[null]
-this.b4(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.Jo
+this.iH(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
+t:function(a,b){var z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){var z,y,x,w
-z=this.Jo
+z=this.ao
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.IO
+x=this.iT
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x){x=[y]
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.b4(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
+this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},
 gl0:function(a){return P.lD.prototype.gl0.call(this,this)},
 gor:function(a){return P.lD.prototype.gor.call(this,this)},
-Mh:function(a,b,c){var z,y,x
+Yj:function(a,b,c){var z,y,x
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.IO
+z=this.iT
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.Jo
+if(z&&y>0){z=this.ao
 H.xF(z,b,y)
-this.b4(G.K6(this,b,y,H.j5(z,b,y,null).br(0)))}H.xr(this.Jo,b,c)},
+this.iH(G.K6(this,b,y,H.j5(z,b,y,null).br(0)))}H.aB(this.ao,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.Jo
+z=this.ao
 y=z.length
-this.n9(y,y+1)
-x=this.IO
+this.On(y,y+1)
+x=this.iT
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)this.b4(G.K6(this,y,1,null))
+if(x)this.iH(G.K6(this,y,1,null))
 C.Nm.h(z,b)},
 FV:function(a,b){var z,y,x,w
-z=this.Jo
+z=this.ao
 y=z.length
 C.Nm.FV(z,b)
-this.n9(y,z.length)
+this.On(y,z.length)
 x=z.length-y
-z=this.IO
+z=this.iT
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.b4(G.K6(this,y,x,null))},
+if(z&&x>0)this.iH(G.K6(this,y,x,null))},
 UZ:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
-if(!z||b>this.Jo.length)H.vh(P.TE(b,0,this.gB(this)))
+if(!z||b>this.ao.length)H.vh(P.TE(b,0,this.gB(this)))
 y=c>=b
-if(!y||c>this.Jo.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.Jo
+w=this.ao
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -11287,7 +11935,7 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.IO
+u=this.iT
 if(u!=null){t=u.iE
 u=t==null?u!=null:t!==u}else u=!1
 if(u&&x>0){if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
@@ -11300,72 +11948,72 @@
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
-this.b4(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
+this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
 UG:function(a,b,c){var z,y,x,w
-if(b<0||b>this.Jo.length)throw H.b(P.TE(b,0,this.gB(this)))
+if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.Jo
+z=this.ao
 x=z.length
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
-H.xr(z,b,c)
-this.n9(x,z.length)
-z=this.IO
+H.aB(z,b,c)
+this.On(x,z.length)
+z=this.iT
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.b4(G.K6(this,b,y,null))},
-aP:function(a,b,c){var z,y,x
-if(b>this.Jo.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.Jo
+if(z&&y>0)this.iH(G.K6(this,b,y,null))},
+xe:function(a,b,c){var z,y,x
+if(b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.ao
 y=z.length
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
 y=z.length
 H.qG(z,b+1,y,this,b)
 y=z.length
-this.n9(y-1,y)
-y=this.IO
+this.On(y-1,y)
+y=this.iT
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
-if(y)this.b4(G.K6(this,b,1,null))
+if(y)this.iH(G.K6(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
 z[b]=c},
-b4:function(a){var z,y
-z=this.IO
+iH:function(a){var z,y
+z=this.iT
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
-if(this.ID==null){this.ID=[]
-P.rb(this.gL6())}this.ID.push(a)},
-n9:function(a,b){var z,y
+if(this.b3==null){this.b3=[]
+P.rb(this.gL6())}this.b3.push(a)},
+On:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=b===0
 this.ct(this,C.ai,z,y)
 this.ct(this,C.nZ,!z,!y)},
-cv:[function(){var z,y,x
-z=this.ID
+Lu:[function(){var z,y,x
+z=this.b3
 if(z==null)return!1
 y=G.Qi(this,z)
-this.ID=null
-z=this.IO
+this.b3=null
+z=this.iT
 if(z!=null){x=z.iE
 x=x==null?z!=null:x!==z}else x=!1
 if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,76],
+return!0}return!1},"$0","gL6",0,0,94],
 $iswn:true,
-static:{uX:function(a,b){var z=H.VM([],[b])
+static:{ch:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(a===b)throw H.b(P.u("can't use same list for previous and current"))
 for(z=J.mY(c),y=J.w1(b);z.G();){x=z.gl()
 w=J.RE(x)
-v=J.WB(w.gvH(x),x.gNg())
-u=J.WB(w.gvH(x),x.gRt().G4.length)
+v=J.ew(w.gvH(x),x.gNg())
+u=J.ew(w.gvH(x),x.gRt().G4.length)
 t=y.Mu(b,w.gvH(x),v)
 w=w.gvH(x)
 s=J.Wx(w)
@@ -11382,7 +12030,7 @@
 m=s-o
 H.qG(a,w,n,t,0)
 if(o!==0){H.qG(a,n,m,a,u)
-C.Nm.sB(a,m)}}else{o=J.xH(p,q)
+C.Nm.sB(a,m)}}else{o=J.Hn(p,q)
 r=a.length
 if(typeof o!=="number")return H.s(o)
 l=r+o
@@ -11394,8 +12042,8 @@
 "^":"rm+Pi;",
 $isd3:true},
 cj:{
-"^":"Xs:47;a",
-$0:function(){this.a.IO=null},
+"^":"Tp:64;a",
+$0:function(){this.a.iT=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
 ya:{
@@ -11427,9 +12075,9 @@
 w=z.t(0,b)
 z.u(0,b,c)
 if(x!==z.gB(z)){F.Wi(this,C.Wn,x,z.gB(z))
-this.SZ(this,H.VM(new V.ya(b,null,c,!0,!1),[null,null]))
-this.G8()}else if(!J.xC(w,c)){this.SZ(this,H.VM(new V.ya(b,w,c,!1,!1),[null,null]))
-this.SZ(this,H.VM(new T.qI(this,C.Yn,null,null),[null]))}},
+this.nq(this,H.VM(new V.ya(b,null,c,!0,!1),[null,null]))
+this.G8()}else if(!J.xC(w,c)){this.nq(this,H.VM(new V.ya(b,w,c,!1,!1),[null,null]))
+this.nq(this,H.VM(new T.qI(this,C.Yn,null,null),[null]))}},
 FV:function(a,b){J.kH(b,new V.zT(this))},
 V1:function(a){var z,y,x,w
 z=this.Zp
@@ -11442,8 +12090,8 @@
 this.G8()}z.V1(0)},
 aN:function(a,b){return this.Zp.aN(0,b)},
 bu:function(a){return P.vW(this)},
-G8:function(){this.SZ(this,H.VM(new T.qI(this,C.Yy,null,null),[null]))
-this.SZ(this,H.VM(new T.qI(this,C.Yn,null,null),[null]))},
+G8:function(){this.nq(this,H.VM(new T.qI(this,C.SV,null,null),[null]))
+this.nq(this,H.VM(new T.qI(this,C.Yn,null,null),[null]))},
 $isqC:true,
 $isZ0:true,
 static:{AB:function(a,b,c){var z
@@ -11451,38 +12099,38 @@
 else z=!!a.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.YM(null,null,null,b,c),null,null),[b,c])
 return z}}},
 zT:{
-"^":"Xs;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,51,16,"call"],
+"^":"Tp;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,68,18,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Xs:50;a",
+"^":"Tp:67;a",
 $2:function(a,b){var z=this.a
-z.SZ(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
+z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
 $isEH:true}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
 "^":"",
-cc:{
-"^":"Ap;fq,Pc,op,Vq,qU",
+Qw:{
+"^":"Ap;fq,Pc,cl,Vq,dS",
 QI:function(a){return this.Pc.$1(a)},
 EO:function(a){return this.Vq.$1(a)},
 TR:function(a,b){var z
 this.Vq=b
 z=this.QI(J.mu(this.fq,this.gv7()))
-this.qU=z
+this.dS=z
 return z},
 jA:[function(a){var z=this.QI(a)
-if(J.xC(z,this.qU))return
-this.qU=z
-return this.EO(z)},"$1","gv7",2,0,30,35],
+if(J.xC(z,this.dS))return
+this.dS=z
+return this.EO(z)},"$1","gv7",2,0,10,55],
 S6:function(a){var z=this.fq
 if(z!=null)J.x0(z)
 this.fq=null
 this.Pc=null
-this.op=null
+this.cl=null
 this.Vq=null
-this.qU=null},
+this.dS=null},
 gP:function(a){var z=this.QI(J.Vm(this.fq))
-this.qU=z
+this.dS=z
 return z},
 sP:function(a,b){J.Fc(this.fq,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
@@ -11494,18 +12142,18 @@
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z)return J.UQ(a,$.b7().eB.t(0,b))
+if(z)return J.UQ(a,$.b7().ep.t(0,b))
 try{z=a
 y=b
-x=$.cp().Gu.t(0,y)
+x=$.cp().eA.t(0,y)
 if(x==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+H.d(z)))
 z=x.$1(z)
-return z}catch(w){if(!!J.x(H.Ru(w)).$isMC){z=J.bB(a)
-v=$.mX().Qk(z,C.OV)
-if(!(v!=null&&v.fY===C.it&&!v.Fo))throw w}else throw w}}z=$.Ku()
+return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.bB(a)
+v=$.mX().F1(z,C.OV)
+if(!(v!=null&&v.fY===C.it&&!v.Fo))throw w}else throw w}}z=$.T5()
 if(z.Im(C.Ab))z.x9("can't get "+H.d(b)+" in "+H.d(a))
 return},
-h6:function(a,b,c){var z,y,x
+iu:function(a,b,c){var z,y,x
 if(a==null)return!1
 z=b
 if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
@@ -11514,10 +12162,10 @@
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z){J.kW(a,$.b7().eB.t(0,b),c)
+if(z){J.kW(a,$.b7().ep.t(0,b),c)
 return!0}try{$.cp().Cq(a,b,c)
-return!0}catch(x){if(!!J.x(H.Ru(x)).$isMC){z=J.bB(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.Ku()
+return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.bB(a)
+if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.T5()
 if(z.Im(C.Ab))z.x9("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 cB:function(a){a=J.rr(a)
@@ -11526,49 +12174,49 @@
 if(a[0]===".")return!1
 return $.tN().zD(a)},
 WR:{
-"^":"AR;I3,pn,LG,jR,xX,jB,Hy",
-gEQ:function(){return this.I3==null},
-sP:function(a,b){var z=this.I3
-if(z!=null)z.rL(this.pn,b)},
-gX6:function(){return 2},
+"^":"AR;yc,XF,xE,Fs,GX,W8,Wf",
+gqc:function(){return this.yc==null},
+sP:function(a,b){var z=this.yc
+if(z!=null)z.rL(this.XF,b)},
+gFH:function(){return 2},
 TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
-BB:function(){this.LG=L.BH(this,this.pn)
-this.Oq(!0)},
-fV:function(){this.Hy=null
-this.I3=null
-this.pn=null},
-GA:function(a){this.I3.kJ(this.pn,a)},
-Oq:function(a){var z,y
-z=this.Hy
-y=this.I3.Tl(this.pn)
-this.Hy=y
+NJ:function(){this.xE=L.SE(this,this.XF)
+this.hQ(!0)},
+kH:function(){this.Wf=null
+this.yc=null
+this.XF=null},
+nf:function(a){this.yc.VV(this.XF,a)},
+hQ:function(a){var z,y
+z=this.Wf
+y=this.yc.Tl(this.XF)
+this.Wf=y
 if(a||J.xC(y,z))return!1
-this.WP(this.Hy,z)
+this.zc(this.Wf,z)
 return!0},
-Pz:function(){return this.Oq(!1)},
+lI:function(){return this.hQ(!1)},
 $isAp:true},
 Tv:{
-"^":"a;Ih",
-gB:function(a){return this.Ih.length},
-gl0:function(a){return this.Ih.length===0},
+"^":"a;Ld",
+gB:function(a){return this.Ld.length},
+gl0:function(a){return this.Ld.length===0},
 gPu:function(){return!0},
 bu:function(a){if(!this.gPu())return"<invalid path>"
-return H.VM(new H.lJ(this.Ih,new L.f7()),[null,null]).zV(0,".")},
+return H.VM(new H.lJ(this.Ld,new L.f7()),[null,null]).zV(0,".")},
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isTv)return!1
 if(this.gPu()!==b.gPu())return!1
-z=this.Ih
+z=this.Ld
 y=z.length
-x=b.Ih
+x=b.Ld
 if(y!==x.length)return!1
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=z[w]
 if(w>=x.length)return H.e(x,w)
 if(!J.xC(v,x[w]))return!1}return!0},
 giO:function(a){var z,y,x,w,v
-for(z=this.Ih,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
+for(z=this.Ld,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=J.v1(z[w])
 if(typeof v!=="number")return H.s(v)
 x=536870911&x+v
@@ -11578,20 +12226,20 @@
 return 536870911&x+((16383&x)<<15>>>0)},
 Tl:function(a){var z,y
 if(!this.gPu())return
-for(z=this.Ih,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+for(z=this.Ld,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 if(a==null)return
 a=L.yf(a,y)}return a},
 rL:function(a,b){var z,y,x
-z=this.Ih
+z=this.Ld
 y=z.length-1
 if(y<0)return!1
 for(x=0;x<y;++x){if(a==null)return!1
 if(x>=z.length)return H.e(z,x)
 a=L.yf(a,z[x])}if(y>=z.length)return H.e(z,y)
-return L.h6(a,z[y],b)},
-kJ:function(a,b){var z,y,x,w
-if(!this.gPu()||this.Ih.length===0)return
-z=this.Ih
+return L.iu(a,z[y],b)},
+VV:function(a,b){var z,y,x,w
+if(!this.gPu()||this.Ld.length===0)return
+z=this.Ld
 y=z.length-1
 for(x=0;a!=null;x=w){b.$1(a)
 if(x>=y)break
@@ -11607,7 +12255,7 @@
 if((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Tv(z)}if(a==null)a=""
 w=$.fX().t(0,a)
 if(w!=null)return w
-if(!L.cB(a))return $.C4()
+if(!L.cB(a))return $.V6()
 v=[]
 y=J.rr(a).split(".")
 u=new H.a7(y,y.length,0,null)
@@ -11615,7 +12263,7 @@
 for(;u.G();){x=u.lo
 if(J.xC(x,""))continue
 t=H.BU(x,10,new L.oq())
-v.push(t!=null?t:$.b7().d8.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
+v.push(t!=null?t:$.b7().I1.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
 y=$.fX()
 if(y.X5>=100){y.toString
 u=new P.i5(y)
@@ -11625,162 +12273,162 @@
 y.Rz(0,s.gl())}y.u(0,a,w)
 return w}}},
 oq:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return},
 $isEH:true},
 f7:{
-"^":"Xs:30;",
-$1:[function(a){return!!J.x(a).$isIN?$.b7().eB.t(0,a):a},"$1",null,2,0,null,117,"call"],
+"^":"Tp:10;",
+$1:[function(a){return!!J.x(a).$isIN?$.b7().ep.t(0,a):a},"$1",null,2,0,null,138,"call"],
 $isEH:true},
-vH:{
-"^":"Tv;Ih",
+Ul:{
+"^":"Tv;Ld",
 gPu:function(){return!1},
-static:{"^":"qa"}},
+static:{"^":"qr"}},
 MdQ:{
-"^":"Xs:47;",
+"^":"Tp:64;",
 $0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.ol("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true},
 NV:{
-"^":"AR;LG,Bg,jR,xX,jB,Hy",
-gEQ:function(){return this.Bg==null},
-gX6:function(){return 3},
+"^":"AR;xE,TV,Fs,GX,W8,Wf",
+gqc:function(){return this.TV==null},
+gFH:function(){return 3},
 TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
-BB:function(){var z,y,x,w
-this.Oq(!0)
-for(z=this.Bg,y=z.length,x=0;x<y;x+=2){w=z[x]
+NJ:function(){var z,y,x,w
+this.hQ(!0)
+for(z=this.TV,y=z.length,x=0;x<y;x+=2){w=z[x]
 if(w!==C.dV){z=$.xG
-if(z!=null){y=z.zT
+if(z!=null){y=z.kT
 y=y==null?w!=null:y!==w}else y=!0
 if(y){z=new L.zG(w,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.R3.u(0,this.jR,this)
-this.GA(z.gTT())
-this.LG=null
+$.xG=z}z.Nl.u(0,this.Fs,this)
+this.nf(z.gTT())
+this.xE=null
 break}}},
-fV:function(){var z,y,x,w
-this.Hy=null
-for(z=0;y=this.Bg,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
+kH:function(){var z,y,x,w
+this.Wf=null
+for(z=0;y=this.TV,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
 if(w>=x)return H.e(y,w)
-J.x0(y[w])}this.Bg=null},
+J.x0(y[w])}this.TV=null},
 yN:function(a,b){var z
-if(this.xX!=null||this.Bg==null)throw H.b(P.w("Cannot add paths once started."))
+if(this.GX!=null||this.TV==null)throw H.b(P.w("Cannot add paths once started."))
 if(!J.x(b).$isTv)b=L.hk(b)
-z=this.Bg
+z=this.TV
 z.push(a)
 z.push(b)},
 ti:function(a){return this.yN(a,null)},
-GA:function(a){var z,y,x,w,v
-for(z=0;y=this.Bg,x=y.length,z<x;z+=2){w=y[z]
+nf:function(a){var z,y,x,w,v
+for(z=0;y=this.TV,x=y.length,z<x;z+=2){w=y[z]
 if(w!==C.dV){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isTv").kJ(w,a)}}},
-Oq:function(a){var z,y,x,w,v,u,t,s,r
-J.wg(this.Hy,C.jn.cU(this.Bg.length,2))
-for(z=!1,y=null,x=0;w=this.Bg,v=w.length,x<v;x+=2){u=x+1
+H.Go(y[v],"$isTv").VV(w,a)}}},
+hQ:function(a){var z,y,x,w,v,u,t,s,r
+J.Vw(this.Wf,C.jn.cU(this.TV.length,2))
+for(z=!1,y=null,x=0;w=this.TV,v=w.length,x<v;x+=2){u=x+1
 if(u>=v)return H.e(w,u)
 t=w[u]
 s=w[x]
 if(s===C.dV){H.Go(t,"$isAp")
 r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
-if(a){J.kW(this.Hy,C.jn.cU(x,2),r)
-continue}w=this.Hy
+if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
+continue}w=this.Wf
 v=C.jn.cU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
-w=this.jB
+w=this.W8
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.Hy,v))}J.kW(this.Hy,v,r)
+y.u(0,v,J.UQ(this.Wf,v))}J.kW(this.Wf,v,r)
 z=!0}if(!z)return!1
-this.JQ(this.Hy,y,w)
+this.Aw(this.Wf,y,w)
 return!0},
-Pz:function(){return this.Oq(!1)},
+lI:function(){return this.hQ(!1)},
 $isAp:true},
 iNc:{
 "^":"a;"},
 AR:{
-"^":"Ap;jR<",
-d9:function(){return this.xX.$0()},
-hM:function(a){return this.xX.$1(a)},
-Lt:function(a,b){return this.xX.$2(a,b)},
-bO:function(a,b,c){return this.xX.$3(a,b,c)},
-gcF:function(){return this.xX!=null},
-TR:function(a,b){if(this.xX!=null||this.gEQ())throw H.b(P.w("Observer has already been opened."))
-if(X.Lx(b)>this.gX6())throw H.b(P.u("callback should take "+this.gX6()+" or fewer arguments"))
-this.xX=b
-this.jB=P.J(this.gX6(),X.aW(b))
-this.BB()
-return this.Hy},
-gP:function(a){this.Oq(!0)
-return this.Hy},
-S6:function(a){if(this.xX==null)return
-this.fV()
-this.Hy=null
-this.xX=null},
-di:[function(a){if(this.xX!=null)this.Fe()},"$1","gQ8",2,0,15,81],
-Fe:function(){var z=0
-while(!0){if(!(z<1000&&this.Pz()))break;++z}return z>0},
-JQ:function(a,b,c){var z,y,x,w
-try{switch(this.jB){case 0:this.d9()
+"^":"Ap;Fs<",
+TI:function(){return this.GX.$0()},
+K0:function(a){return this.GX.$1(a)},
+tH:function(a,b){return this.GX.$2(a,b)},
+Mm:function(a,b,c){return this.GX.$3(a,b,c)},
+gL9:function(){return this.GX!=null},
+TR:function(a,b){if(this.GX!=null||this.gqc())throw H.b(P.w("Observer has already been opened."))
+if(X.OS(b)>this.gFH())throw H.b(P.u("callback should take "+this.gFH()+" or fewer arguments"))
+this.GX=b
+this.W8=P.J(this.gFH(),X.Zpg(b))
+this.NJ()
+return this.Wf},
+gP:function(a){this.hQ(!0)
+return this.Wf},
+S6:function(a){if(this.GX==null)return
+this.kH()
+this.Wf=null
+this.GX=null},
+xV:[function(a){if(this.GX!=null)this.SG()},"$1","gjM",2,0,17,11],
+SG:function(){var z=0
+while(!0){if(!(z<1000&&this.lI()))break;++z}return z>0},
+Aw:function(a,b,c){var z,y,x,w
+try{switch(this.W8){case 0:this.TI()
 break
-case 1:this.hM(a)
+case 1:this.K0(a)
 break
-case 2:this.Lt(a,b)
+case 2:this.tH(a,b)
 break
-case 3:this.bO(a,b,c)
+case 3:this.Mm(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
+y=new H.XO(x,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}},
-WP:function(a,b){return this.JQ(a,b,null)}},
+zc:function(a,b){return this.Aw(a,b,null)}},
 zG:{
-"^":"a;zT,R3,ZY,bl,bV",
-TR:function(a,b){this.R3.u(0,b.gjR(),b)
-b.GA(this.gTT())},
-wE:[function(a){var z=J.x(a)
-if(!!z.$iswn)this.Uq(a.gRT())
-if(!!z.$isd3)this.Uq(z.gqh(a))},"$1","gTT",2,0,118],
-Uq:function(a){var z,y
-if(this.ZY==null)this.ZY=P.YM(null,null,null,null,null)
-z=this.bl
+"^":"a;kT,Nl,rS,HN,op",
+TR:function(a,b){this.Nl.u(0,b.gFs(),b)
+b.nf(this.gTT())},
+we:[function(a){var z=J.x(a)
+if(!!z.$iswn)this.c1(a.gRT())
+if(!!z.$isd3)this.c1(z.gqh(a))},"$1","gTT",2,0,139],
+c1:function(a){var z,y
+if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
+z=this.HN
 y=z!=null?z.Rz(0,a):null
-if(y!=null)this.ZY.u(0,a,y)
-else if(!this.ZY.x4(a))this.ZY.u(0,a,a.yI(this.gp7()))},
+if(y!=null)this.rS.u(0,a,y)
+else if(!this.rS.x4(a))this.rS.u(0,a,a.yI(this.gCP()))},
 CH:[function(a){var z,y,x,w,v
-if(!this.bV)return
-z=this.bl
+if(!this.op)return
+z=this.HN
 if(z==null)z=P.YM(null,null,null,null,null)
-this.bl=this.ZY
-this.ZY=z
-for(y=this.R3,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.qv]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
-if(v.gcF())v.GA(this.gTT())}for(y=this.bl,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
-this.bl=null},"$0","gSI",0,0,13],
-Hi:[function(a){var z,y
-for(z=this.R3,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(y.gcF())y.Pz()}this.bV=!0
-P.rb(this.gSI(this))},"$1","gp7",2,0,15,119],
-static:{"^":"xG",BH:function(a,b){var z,y
+this.HN=this.rS
+this.rS=z
+for(y=this.Nl,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.qv]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
+if(v.gL9())v.nf(this.gTT())}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
+this.HN=null},"$0","gSI",0,0,15],
+KO:[function(a){var z,y
+for(z=this.Nl,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(y.gL9())y.lI()}this.op=!0
+P.rb(this.gSI(this))},"$1","gCP",2,0,17,140],
+static:{"^":"xG",SE:function(a,b){var z,y
 z=$.xG
-if(z!=null){y=z.zT
+if(z!=null){y=z.kT
 y=y==null?b!=null:y!==b}else y=!0
 if(y){z=new L.zG(b,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.R3.u(0,a.jR,a)
-a.GA(z.gTT())}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
+$.xG=z}z.Nl.u(0,a.Fs,a)
+a.nf(z.gTT())}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
 tB:[function(a){var z,y,x
 z=J.x(a)
 if(!!z.$isd3)return a
 if(!!z.$isZ0){y=V.AB(a,null,null)
-z.aN(a,new R.yx(y))
-return y}if(!!z.$iscX){z=z.ez(a,R.Ft())
-x=Q.uX(null,null)
+z.aN(a,new R.Fk(y))
+return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
+x=Q.ch(null,null)
 x.FV(0,z)
-return x}return a},"$1","Ft",2,0,30,16],
-yx:{
-"^":"Xs:50;a",
+return x}return a},"$1","Ft",2,0,10,18],
+Fk:{
+"^":"Tp:67;a",
 $2:function(a,b){this.a.u(0,R.tB(a),R.tB(b))},
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
-oF:function(a,b){var z,y,x
-for(z=$.mX().Me(0,a,C.YV),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+Jy:function(a,b){var z,y,x
+for(z=$.mX().Me(0,a,C.Hh),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
 if(b==null)b=P.Fl(null,null)
@@ -11791,61 +12439,67 @@
 if(z==null)return
 y=J.UQ(z,"ShadowCSS")
 if(y==null)return
-y.K9("shimStyling",[a,b,c])},
+y.V7("shimStyling",[a,b,c])},
 Hl:function(a){var z,y,x,w,v
 if(a==null)return""
-if($.ok)return""
+if($.UG)return""
 w=J.RE(a)
 z=w.gmH(a)
 if(J.xC(z,""))z=w.gQg(a).MW.getAttribute("href")
 try{w=new XMLHttpRequest()
-C.W3.eo(w,"GET",z,!1)
+C.W3.kP(w,"GET",z,!1)
 w.send()
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
 if(!!J.x(w).$isBK){y=w
-x=new H.oP(v,null)
+x=new H.XO(v,null)
 $.Es().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
 fS:[function(a){var z,y
-z=$.b7().eB.t(0,a)
+z=$.b7().ep.t(0,a)
 if(z==null)return!1
 y=J.rY(z)
-return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","NL",2,0,41,42],
+return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","NL",2,0,59,60],
 Ad:function(a,b){$.Ej().u(0,a,b)
 H.Go(J.UQ($.ca(),"Polymer"),"$isr7").PO([a])},
-xv:function(a){A.pb(a,new A.YC())},
-pb:function(a,b){var z
+xv:function(a){A.VxC(a,new A.Sv())},
+VxC:function(a,b){var z
 if(a==null)return
 b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.VxC(z,b)},
 pf:function(a,b,c){return new A.L6(a,b)},
-ZI:function(a,b){var z,y
+h6:function(a,b){var z,y
 if(a==null)return
 z=document.createElement("style",null)
 J.t3(z,J.dY(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
 b.appendChild(z)},
+YK:function(){if($.UG){A.X1($.M6,!0)
+return $.X3}var z=$.X3.qp(O.Ht())
+z.Gr(new A.mS())
+return z},
 X1:function(a,b){var z
+if($.AC)throw H.b("Initialization was already done.")
+$.AC=!0
 A.JP()
 $.ok=b
-for(z=H.VM(new H.a7(a,57,0,null),[H.Kp(a,0)]);z.G();)z.lo.$0()},
+for(a.length,z=H.VM(new H.a7(a,72,0,null),[H.Kp(a,0)]);z.G();)z.lo.$0()},
 JP:function(){var z,y,x,w,v
 z=J.UQ($.ca(),"Polymer")
 if(z==null)throw H.b(P.w("polymer.js must be loaded before polymer.dart, please add <link rel=\"import\" href=\"packages/polymer/polymer.html\"> to your <head> before any Dart scripts. Alternatively you can get a different version of polymer.js by following the instructions at http://www.polymer-project.org; if you do that be sure to include the platform polyfills."))
 y=$.X3
-z.K9("whenPolymerReady",[y.ce(new A.hp())])
+z.V7("whenPolymerReady",[y.ce(new A.hp())])
 x=J.UQ(P.Oe(document.createElement("polymer-element",null)),"__proto__")
 if(!!J.x(x).$isKV)x=P.Oe(x)
 w=J.U6(x)
 v=w.t(x,"register")
 if(v==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
-w.u(x,"register",new P.r7(P.z8(new A.k2(y,v),!0)))},
+w.u(x,"register",P.mt(new A.k2(y,v)))},
 XP:{
-"^":"a;FL<,t5>,P1<,oc>,Q7<,NF<,iK<,kK<,of,lD,PS<,Ve",
+"^":"a;FL<,t5>,P1<,oc>,Q7<,NF<,iK<,kK<,Qk,lD,PS<,Ve",
 gZf:function(){var z,y
-z=J.c1(this.FL,"template")
+z=J.Eh(this.FL,"template")
 if(z!=null)y=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
 else y=null
 return y},
@@ -11854,7 +12508,7 @@
 if(z==null)return
 for(y=J.MK(z,"shadow"),y=y.gA(y);y.G();){x=y.lo
 w=J.RE(x)
-if(J.FN(w.gUN(x)))w.mx(x,document.createElement("content",null))}}},
+if(J.tx(w.gUN(x)))w.mx(x,document.createElement("content",null))}}},
 Ba:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 for(z=null,y=this;y!=null;){z=J.Vs(y.gFL()).MW.getAttribute("extends")
 y=y.gP1()}x=document
@@ -11863,7 +12517,7 @@
 u=J.Xr(w)
 if(u==null)H.vh(P.u(w))
 t=u.prototype
-s=J.Nq(w,"created")
+s=J.YC(w,"created")
 if(s==null)H.vh(P.u(H.d(w)+" has no constructor called 'created'"))
 J.m0(W.r3("article",null))
 r=u.$nativeSuperclassTag
@@ -11872,7 +12526,7 @@
 if(w){if(!J.xC(r,"HTMLElement"))H.vh(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(x.createElement(z) instanceof window[r]))H.vh(P.f("extendsTag does not match base native class"))
 q=v[r]
 p={}
-p.createdCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Rl(s,t),1))}
+p.createdCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Xw(s,t),1))}
 p.attachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.B4(),1))}
 p.detachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Z6(),1))}
 p.attributeChangedCallback={value:function(b){return function(c,d,e){return b(this,c,d,e)}}(H.tR(W.A6(),4))}
@@ -11887,11 +12541,11 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 this.Q7=y}z=this.t5
-this.Q7=A.oF(z,this.Q7)
+this.Q7=A.Jy(z,this.Q7)
 x=J.Vs(this.FL).MW.getAttribute("attributes")
 if(x!=null)for(y=C.xB.Fr(x,$.zZ()),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
 if(v==="")continue
-u=$.b7().d8.t(0,v)
+u=$.b7().I1.t(0,v)
 t=L.hk([u])
 s=this.Q7
 if(s!=null&&s.x4(t))continue
@@ -11909,14 +12563,14 @@
 if(y!=null)z.FV(0,y.gkK())
 J.Vs(this.FL).aN(0,new A.eY(this))},
 W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
-Mi:function(){var z=this.Hs("[rel=stylesheet]")
-this.of=z
+Mi:function(){var z=this.Bg("[rel=stylesheet]")
+this.Qk=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
-f6:function(){var z=this.Hs("style[polymer-scope]")
+f6:function(){var z=this.Bg("style[polymer-scope]")
 this.lD=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
 m1:function(){var z,y,x,w,v,u,t
-z=this.of
+z=this.Qk
 z.toString
 y=H.VM(new H.U5(z,new A.ZG()),[null])
 x=this.gZf()
@@ -11926,18 +12580,18 @@
 w.vM=t+"\n"}if(w.vM.length>0){z=document.createElement("style",null)
 J.t3(z,H.d(w))
 v=J.RE(x)
-v.FO(x,z,v.gPZ(x))}}},
+v.mK(x,z,v.gPZ(x))}}},
 Wz:function(a,b){var z,y,x
 z=J.MK(this.FL,a)
 y=z.br(z)
 x=this.gZf()
 if(x!=null)C.Nm.FV(y,J.MK(x,a))
 return y},
-Hs:function(a){return this.Wz(a,null)},
+Bg:function(a){return this.Wz(a,null)},
 kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.ua("[polymer-scope="+a+"]")
-for(x=this.of,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.SO(J.mY(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.Hl(w.gl())
+for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.SO(J.mY(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.Hl(w.gl())
 u=z.vM+=typeof v==="string"?v:H.d(v)
 z.vM=u+"\n\n"}for(x=this.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.mY(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
 w=z.vM+=typeof v==="string"?v:H.d(v)
@@ -11953,9 +12607,9 @@
 if(this.iK==null)this.iK=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
-v=$.b7().eB.t(0,w)
+v=$.b7().ep.t(0,w)
 w=J.U6(v)
-v=w.Nj(v,0,J.xH(w.gB(v),7))
+v=w.Nj(v,0,J.Hn(w.gB(v),7))
 this.iK.u(0,L.hk(v),[x.goc(y)])}},
 I7:function(){var z,y,x
 for(z=$.mX().Me(0,this.t5,C.Xk),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo.gDv()
@@ -11963,15 +12617,15 @@
 x.$builtinTypeInfo=[H.Kp(y,0)]
 for(;x.G();)continue}},
 Yl:function(a){var z=P.L5(null,null,null,P.qU,null)
-a.aN(0,new A.MX(z))
+a.aN(0,new A.Tj(z))
 return z},
 $isXP:true},
 eY:{
-"^":"Xs:50;a",
+"^":"Tp:67;a",
 $2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
 $isEH:true},
 BO:{
-"^":"Xs:50;a",
+"^":"Tp:67;a",
 $2:function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
@@ -11979,32 +12633,32 @@
 if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
 $isEH:true},
 ZG:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
 ua:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){return J.RF(a,this.a)},
 $isEH:true},
 ix:{
-"^":"Xs:47;",
+"^":"Tp:64;",
 $0:function(){return[]},
 $isEH:true},
-MX:{
-"^":"Xs:120;a",
+Tj:{
+"^":"Tp:141;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 DOe:{
-"^":"Xs:47;",
+"^":"Tp:64;",
 $0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
-C.SP.aN(0,new A.LfS(z))
+C.SP.aN(0,new A.xb(z))
 return z},
 $isEH:true},
-LfS:{
-"^":"Xs:50;a",
+xb:{
+"^":"Tp:67;a",
 $2:function(a,b){this.a.u(0,b,a)},
 $isEH:true},
-yL:{
+A2:{
 "^":"ndx;"},
 dM:{
 "^":"a;",
@@ -12017,7 +12671,7 @@
 y=z==null||z===""?this.gqn(a):z
 a.a6=$.RA().t(0,y)
 this.Xl(a)
-this.oR(a)
+this.Z2(a)
 this.fk(a)
 this.Uc(a)
 $.Bh=$.Bh+1
@@ -12033,14 +12687,14 @@
 aI:function(a,b){var z,y,x,w
 z=J.RE(b)
 y=z.Wk(b,"template")
-if(y!=null)if(J.Vs(a.a6.gFL()).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
+if(y!=null)if(J.Vs(a.a6.gFL()).MW.hasAttribute("lightdom")===!0){this.kD(a,y)
 x=null}else x=this.TH(a,y)
 else x=null
 if(!J.x(x).$isI0)return
 w=z.gQg(b).MW.getAttribute("name")
 if(w==null)return
 a.BA.u(0,w,x)},
-Se:function(a,b){var z,y
+kD:function(a,b){var z,y
 if(b==null)return
 z=!!J.x(b).$isvy?b:M.Ky(b)
 y=z.ZK(a,a.on)
@@ -12051,7 +12705,7 @@
 if(b==null)return
 this.gIW(a)
 z=this.er(a)
-$.RV().u(0,z,a)
+$.c7().u(0,z,a)
 z.applyAuthorStyles=!1
 z.resetStyleInheritance=!1
 y=!!J.x(b).$isvy?b:M.Ky(b)
@@ -12063,7 +12717,7 @@
 y.u(0,J.F8(x),x)}},
 wN:function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
-oR:function(a){a.a6.gkK().aN(0,new A.Sv(a))},
+Z2:function(a){a.a6.gkK().aN(0,new A.dZ(a))},
 fk:function(a){if(a.a6.gNF()==null)return
 this.gQg(a).aN(0,this.ghW(a))},
 D3:[function(a,b,c){var z,y,x,w,v,u
@@ -12077,7 +12731,7 @@
 x=J.x(v)
 u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.HH))&&w!=null?J.bB(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,121],
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,142],
 B2:function(a,b){var z=a.a6.gNF()
 if(z==null)return
 return z.t(0,b)},
@@ -12095,11 +12749,11 @@
 if(a.a6==null)this.es(a)
 z=this.B2(a,b)
 if(z==null)return J.FS(M.Ky(a),b,c,d)
-else{J.SB(M.Ky(a),b)
+else{J.n1(M.Ky(a),b)
 y=J.RE(z)
 x=y.goc(z)
-w=$.ZH()
-if(w.Im(C.eI))w.J4("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gqn(a))+"].[name]")
+w=$.zB()
+if(w.Im(C.t4))w.J4("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gqn(a))+"].[name]")
 w=J.RE(c)
 if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
 v=new A.Bf(a,x,c,null,null)
@@ -12111,33 +12765,33 @@
 J.kW(J.QE(M.Ky(a)),b,v)
 return v}},
 gCd:function(a){return J.QE(M.Ky(a))},
-Yj:function(a,b){return J.SB(M.Ky(a),b)},
+Mh:function(a,b){return J.n1(M.Ky(a),b)},
 x3:function(a){var z,y
 if(a.q9===!0)return
-$.RI().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
+$.EM().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
 z=a.YE
 y=this.gJg(a)
 if(z!=null)z.TP(0)
 else z=new A.S0(null,null)
 z.jd=y
-z.ih=P.ww(C.RT,z.gv6(z))
+z.ih=P.ww(C.ny,z.gv6(z))
 a.YE=z},
-GB:[function(a){var z,y
+BM:[function(a){var z,y
 if(a.q9===!0)return
 z=a.JB
 if(z!=null){z.S6(0)
 a.JB=null}this.C0(a)
-J.D9(M.Ky(a))
+J.DB(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.q9=!0},"$0","gJg",0,0,13],
+y=y.olderShadowRoot}a.q9=!0},"$0","gJg",0,0,15],
 dH:function(a,b){var z
-if(a.q9===!0){$.RI().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
-return}$.RI().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
+if(a.q9===!0){$.EM().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
+return}$.EM().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.YE
 if(z!=null){z.TP(0)
 a.YE=null}if(b===!0)return
-A.pb(this.gIW(a),new A.TV())},
+A.VxC(this.gIW(a),new A.TV())},
 oW:function(a){return this.dH(a,null)},
 Xl:function(a){var z,y,x,w,v,u,t
 z=a.a6.giK()
@@ -12147,28 +12801,27 @@
 if(!x||y!=null){x=$.ps
 $.ps=x+1
 v=new L.NV(null,[],x,null,null,null)
-v.Hy=[]
+v.Wf=[]
 a.JB=v
 if(w)for(x=H.VM(new P.fG(z),[H.Kp(z,0)]),u=x.Fb,x=H.VM(new P.EQ(u,u.Ig(),0,null),[H.Kp(x,0)]);x.G();){t=x.fD
 v.yN(a,t)
 this.rJ(a,t,t.Tl(a),null)}if(y!=null)for(x=y.gvc(),u=x.Fb,x=H.VM(new P.N6(u,u.zN,null,null),[H.Kp(x,0)]),x.zq=x.Fb.H9;x.G();){t=x.fD
 if(!w||!z.x4(t))v.yN(a,t)}L.AR.prototype.TR.call(v,v,this.gnu(a))}},
-FQ:[function(a,b,c,d){J.kH(c,new A.n1(a,b,c,d,a.a6.giK(),a.a6.gQ7(),P.op(null,null,null,null)))},"$3","gnu",6,0,122],
+FQ:[function(a,b,c,d){J.kH(c,new A.qz(a,b,c,d,a.a6.giK(),a.a6.gQ7(),P.op(null,null,null,null)))},"$3","gnu",6,0,143],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=a.a6.giK()
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
 if(!!J.x(d).$iswn){x=$.dn()
-if(x.Im(C.eI))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
+if(x.Im(C.t4))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
 this.l5(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.dn()
-if(x.Im(C.eI))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
+if(x.Im(C.t4))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gRT().w4(!1)
 x=w.Lj
-x.toString
-w.pN=new A.V1(a,d,y)
+w.pN=x.wY(new A.V1(a,d,y))
 w.o7=P.VH(P.Mm(),x)
-w.Bd=P.v3()
+w.Bd=x.Al(P.od())
 x=H.d(b)+"__array"
 v=a.nh
 if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
@@ -12186,7 +12839,7 @@
 z=a.a6.gPS()
 if(z.gl0(z))return
 y=$.Uk()
-if(y.Im(C.eI))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
+if(y.Im(C.t4))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
 this.UH(a,a,z.gvc(),this.gD4(a))},
 UH:function(a,b,c,d){var z,y,x,w,v,u,t
 for(z=c.Fb,z=H.VM(new P.N6(z,z.zN,null,null),[H.Kp(c,0)]),z.zq=z.Fb.H9,y=J.RE(b);z.G();){x=z.fD
@@ -12196,27 +12849,27 @@
 t=new W.fd(0,w.bi,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
 w=t.G9
-if(w!=null&&t.VP<=0)J.cZ(t.bi,v,w,u)}},
+if(w!=null&&t.VP<=0)J.FI(t.bi,v,w,u)}},
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
 y=$.Uk()
-x=y.Im(C.eI)
+x=y.Im(C.t4)
 if(x)y.J4(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
 w=a.a6.gPS()
 v=z.gt5(b)
 u=J.UQ($.pT(),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 ["+t+"]")
-this.ea(a,a,t,[b,!!z.$iseC?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,123,59],
+this.ea(a,a,t,[b,!!z.$iseC?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,144,76],
 ea:function(a,b,c,d){var z,y,x,w
 z=$.Uk()
-y=z.Im(C.eI)
+y=z.Im(C.t4)
 if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
-if(!!J.x(c).$isEH){x=X.aW(c)
+if(!!J.x(c).$isEH){x=X.Zpg(c)
 if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
 C.Nm.sB(d,x)
-H.im(c,d,P.Te(null))}else if(typeof c==="string"){w=$.b7().d8.t(0,c)
+H.im(c,d,P.Te(null))}else if(typeof c==="string"){w=$.b7().I1.t(0,c)
 $.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
 if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},
 $isdM:true,
@@ -12225,27 +12878,27 @@
 $ish4:true,
 $isPZ:true,
 $isKV:true},
-Sv:{
-"^":"Xs:50;a",
+dZ:{
+"^":"Tp:67;a",
 $2:function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
 z.t(0,a)},
 $isEH:true},
 Xi:{
-"^":"Xs:47;b",
+"^":"Tp:64;b",
 $0:function(){return this.b},
 $isEH:true},
 TV:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){var z=J.x(a)
 if(!!z.$isdM)z.oW(a)},
 $isEH:true},
-YC:{
-"^":"Xs:30;",
-$1:function(a){return J.D9(!!J.x(a).$isvy?a:M.Ky(a))},
+Sv:{
+"^":"Tp:10;",
+$1:function(a){return J.DB(!!J.x(a).$isvy?a:M.Ky(a))},
 $isEH:true},
-n1:{
-"^":"Xs:50;a,b,c,d,e,f,UI",
+qz:{
+"^":"Tp:67;a,b,c,d,e,f,UI",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.d
 if(typeof a!=="number")return H.s(a)
@@ -12262,49 +12915,49 @@
 if(!q.h(0,p))continue
 o=u.t(v,a)
 s.rJ(t,x,o,b)
-$.cp().Ck(t,p,[b,o,v,r,z],!0,null)}},"$2",null,4,0,null,124,34,"call"],
+$.cp().Ck(t,p,[b,o,v,r,z],!0,null)}},"$2",null,4,0,null,145,54,"call"],
 $isEH:true},
 V1:{
-"^":"Xs:30;a,b,c",
+"^":"Tp:10;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,125,"call"],
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 L6:{
-"^":"Xs:129;a,b",
+"^":"Tp:150;a,b",
 $3:[function(a,b,c){var z,y,x
 z=$.Uk()
-if(z.Im(C.eI))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
+if(z.Im(C.t4))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
 y=J.ZZ(this.b,3)
 x=C.SP.t(0,y)
 if(x!=null)y=x
-return new A.zI(b,y,a,this.a,null)},"$3",null,6,0,null,126,127,128,"call"],
+return new A.zI(b,y,a,this.a,null)},"$3",null,6,0,null,147,148,149,"call"],
 $isEH:true},
 Bf:{
-"^":"Ap;I6,iU,uv,Jq,dY",
+"^":"Ap;I6,iU,jz,Jq,dY",
 AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,15,35],
+$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,17,55],
 ho:[function(a){var z,y,x,w,v
 for(z=J.mY(a),y=this.iU;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
-w=$.cp().Gu.t(0,y)
+w=$.cp().eA.t(0,y)
 if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.AG(z)))
 v=w.$1(z)
 z=this.dY
-if(z==null?v!=null:z!==v)J.Fc(this.uv,v)
-return}}},"$1","gXQ",2,0,130,119],
-TR:function(a,b){return J.mu(this.uv,b)},
-gP:function(a){return J.Vm(this.uv)},
-sP:function(a,b){J.Fc(this.uv,b)
+if(z==null?v!=null:z!==v)J.Fc(this.jz,v)
+return}}},"$1","gXQ",2,0,151,140],
+TR:function(a,b){return J.mu(this.jz,b)},
+gP:function(a){return J.Vm(this.jz)},
+sP:function(a,b){J.Fc(this.jz,b)
 return b},
 S6:function(a){var z=this.Jq
 if(z!=null){z.ed()
-this.Jq=null}J.x0(this.uv)}},
+this.Jq=null}J.x0(this.jz)}},
 ir:{
 "^":"Ot;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 XI:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -12312,8 +12965,8 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.Vk.ZL(a)
-C.Vk.XI(a)
+C.Ki.ZL(a)
+C.Ki.XI(a)
 return a}}},
 jpR:{
 "^":"Bo+dM;",
@@ -12332,7 +12985,7 @@
 return T.uN.prototype.pm.call(this,a,b,c)}},
 zI:{
 "^":"Ap;v3,pB,U1,ED,Jq",
-zU:[function(a){var z,y,x,w,v,u
+cE:[function(a){var z,y,x,w,v,u
 z=this.v3
 y=A.tT(z)
 x=J.x(y)
@@ -12341,7 +12994,7 @@
 if(C.xB.nC(w,"@")){v=this.U1
 w=L.hk(C.xB.yn(w,1)).Tl(v)}else v=y
 u=J.x(a)
-x.ea(y,v,w,[a,!!u.$iseC?u.gey(a):null,z])},"$1","gwi",2,0,30,59],
+x.ea(y,v,w,[a,!!u.$iseC?u.gey(a):null,z])},"$1","gwi",2,0,10,76],
 gP:function(a){return},
 TR:function(a,b){var z=J.PB(this.v3).t(0,this.pB)
 z=H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gwi()),z.Sg),[H.Kp(z,0)])
@@ -12349,12 +13002,12 @@
 this.Jq=z},
 S6:function(a){var z
 if(this.Jq!=null){z=$.Uk()
-if(z.Im(C.eI))z.J4("event.remove: ["+H.d(this.v3)+"]."+H.d(this.pB)+" => ["+H.d(this.U1)+"]."+this.ED+"())")
+if(z.Im(C.t4))z.J4("event.remove: ["+H.d(this.v3)+"]."+H.d(this.pB)+" => ["+H.d(this.U1)+"]."+this.ED+"())")
 this.Jq.ed()
 this.Jq=null}},
 static:{tT:function(a){var z
 for(;z=J.RE(a),z.gBy(a)!=null;)a=z.gBy(a)
-return $.RV().t(0,a)}}},
+return $.c7().t(0,a)}}},
 S0:{
 "^":"a;jd,ih",
 Ws:function(){return this.jd.$0()},
@@ -12362,26 +13015,27 @@
 if(z!=null){z.ed()
 this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"$0","gv6",0,0,13]},
+this.Ws()}},"$0","gv6",0,0,15]},
+mS:{
+"^":"Tp:64;",
+$0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
+$isEH:true},
 hp:{
-"^":"Xs:47;",
+"^":"Tp:64;",
 $0:[function(){var z=$.ln().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"Xs:133;a,b",
-$3:[function(a,b,c){var z,y,x
-z=$.Ej().t(0,b)
-if(z!=null){y=$.RA().t(0,c)
-x=this.a
-x.toString
-return P.T8(x,null,x,new A.v4(a,b,z,y))}return this.b.qP([b,c],a)},"$3",null,6,0,null,131,33,132,"call"],
+"^":"Tp:154;a,b",
+$3:[function(a,b,c){var z=$.Ej().t(0,b)
+if(z!=null)return this.a.Gr(new A.v4(a,b,z,$.RA().t(0,c)))
+return this.b.qP([b,c],a)},"$3",null,6,0,null,152,53,153,"call"],
 $isEH:true},
 v4:{
-"^":"Xs:47;c,d,e,f",
-$0:function(){var z,y,x,w,v,u
+"^":"Tp:64;c,d,e,f",
+$0:[function(){var z,y,x,w,v,u
 z=this.d
 y=this.e
 x=this.f
@@ -12398,183 +13052,183 @@
 v.Mi()
 v.f6()
 v.m1()
-A.ZI(v.J3(v.kO("global"),"global"),document.head)
+A.h6(v.J3(v.kO("global"),"global"),document.head)
 v.FU()
 w=v.gZf()
-A.YG(w,z,x!=null?J.tE(x):null)
+A.YG(w,z,x!=null?J.O6(x):null)
 if($.mX().n6(y,C.MT))$.cp().Ck(y,C.MT,[v],!1,null)
 v.Ba(z)
-return},
+return},"$0",null,0,0,null,"call"],
 $isEH:true}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
 Zh:function(a,b,c){var z,y,x
 z=$.QL().t(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.zc.kV(J.JA(a,"'","\""))
+try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
 return a}},
 Md:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return a},
 $isEH:true},
 lP:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return a},
 $isEH:true},
 Uf:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){var z,y
 try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
 Ra:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
 wJY:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return H.BU(a,null,new Z.fT(b))},
 $isEH:true},
 fT:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a},
 $isEH:true},
 zOQ:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return H.RR(a,new Z.Lf(b))},
 $isEH:true},
 Lf:{
-"^":"Xs:30;b",
+"^":"Tp:10;b",
 $1:function(a){return this.b},
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 dA:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.vo(a.gvc(),new T.o8f(a)).zV(0," ")
-else z=!!z.$iscX?z.zV(a," "):a
-return z},"$1","T4",2,0,25],
+else z=!!z.$isQV?z.zV(a," "):a
+return z},"$1","dI",2,0,46],
 qN:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(a.gvc(),new T.GL(a)).zV(0,";")
-else z=!!z.$iscX?z.zV(a,";"):a
-return z},"$1","xe",2,0,25],
+else z=!!z.$isQV?z.zV(a,";"):a
+return z},"$1","xe",2,0,46],
 o8f:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){return J.xC(this.a.t(0,a),!0)},
 $isEH:true},
 GL:{
-"^":"Xs:30;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,134,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 uN:{
 "^":"VE;",
 pm:function(a,b,c){var z,y,x
 z=new Y.pa(H.VM([],[Y.qS]),P.p9(""),new P.WU(a,0,0,null),null)
-y=new U.Fs()
+y=new U.tu()
 y=new T.FX(y,z,null,null)
 z=z.rD()
 y.mV=z
 y.vi=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
 y.Bp()
 x=y.Te()
-if(M.wR(c)){z=J.x(b)
+if(M.RI(c)){z=J.x(b)
 z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isWH}else z=!1
 if(z)return
 return new T.H1(this,b,x)},
-A5:function(a){return new T.uK(this)}},
+CE:function(a){return new T.uK(this)}},
 H1:{
-"^":"Xs:129;a,b,c",
+"^":"Tp:150;a,b,c",
 $3:[function(a,b,c){var z,y
-if(!J.x(a).$isPF)a=K.xV(a,this.a.jw)
+if(!J.x(a).$isGK)a=K.xV(a,this.a.jw)
 z=!!J.x(b).$ish4
-y=z&&J.xC(this.b,"class")?T.T4():null
+y=z&&J.xC(this.b,"class")?T.dI():null
 if(z&&J.xC(this.b,"style"))y=T.xe()
 if(c===!0)return T.rD(this.c,a,y)
-return new T.tI(a,y,this.c,null,null,null)},"$3",null,6,0,null,126,127,128,"call"],
+return new T.tI(a,y,this.c,null,null,null)},"$3",null,6,0,null,147,148,149,"call"],
 $isEH:true},
 uK:{
-"^":"Xs:30;a",
-$1:[function(a){return!!J.x(a).$isPF?a:K.xV(a,this.a.jw)},"$1",null,2,0,null,126,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return!!J.x(a).$isGK?a:K.xV(a,this.a.jw)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 tI:{
-"^":"Ap;a9,uI,lV,Nl,DY,ZR",
-Co:function(a){return this.Nl.$1(a)},
-lY:[function(a){var z,y
-z=this.ZR
-y=T.r6(a,this.a9,this.uI)
-this.ZR=y
-if(this.Nl!=null&&!J.xC(z,y))this.Co(this.ZR)},"$1","gR5",2,0,30,135],
-gP:function(a){if(this.Nl!=null)return this.ZR
-return T.rD(this.lV,this.a9,this.uI)},
+"^":"Ap;yr,wx,n4,Fg,ML,HR",
+WV:function(a){return this.Fg.$1(a)},
+Ls:[function(a){var z,y
+z=this.HR
+y=T.r6(a,this.yr,this.wx)
+this.HR=y
+if(this.Fg!=null&&!J.xC(z,y))this.WV(this.HR)},"$1","gkR",2,0,10,156],
+gP:function(a){if(this.Fg!=null)return this.HR
+return T.rD(this.n4,this.yr,this.wx)},
 sP:function(a,b){var z,y,x,w,v
-try{w=this.a9
-z=K.jX(this.lV,b,w)
-this.ZR=T.r6(z,w,this.uI)}catch(v){w=H.Ru(v)
+try{w=this.yr
+z=K.jX(this.n4,b,w)
+this.HR=T.r6(z,w,this.wx)}catch(v){w=H.Ru(v)
 y=w
-x=new H.oP(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.lV)+"': "+H.d(y),x)}},
+x=new H.XO(v,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.n4)+"': "+H.d(y),x)}},
 TR:function(a,b){var z,y,x,w,v,u,t
-if(this.Nl!=null)throw H.b(P.w("already open"))
-this.Nl=b
-w=this.lV
-v=this.a9
+if(this.Fg!=null)throw H.b(P.w("already open"))
+this.Fg=b
+w=this.n4
+v=this.yr
 u=H.VM(new P.Sw(null,0,0,0),[null])
 u.Eo(null,null)
-z=J.okV(w,new K.XZ(v,u))
-this.lV=z
-u=z.glr().yI(this.gR5())
+z=J.okV(w,new K.Oy(v,u))
+this.n4=z
+u=z.glr().yI(this.gkR())
 u.fm(0,new T.Tg(z))
-this.DY=u
+this.ML=u
 try{w=z
 J.okV(w,new K.Ed(v))
-w.gK3()
-this.ZR=T.r6(z.gK3(),v,this.uI)}catch(t){w=H.Ru(t)
+w.gXr()
+this.HR=T.r6(z.gXr(),v,this.wx)}catch(t){w=H.Ru(t)
 y=w
-x=new H.oP(t,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(z)+"': "+H.d(y),x)}return this.ZR},
-S6:function(a){if(this.Nl==null)return
-this.DY.ed()
-this.DY=null
-this.lV=H.Go(this.lV,"$isdE").mA
-this.Nl=null},
+x=new H.XO(t,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(z)+"': "+H.d(y),x)}return this.HR},
+S6:function(a){if(this.Fg==null)return
+this.ML.ed()
+this.ML=null
+this.n4=H.Go(this.n4,"$isdE").KL
+this.Fg=null},
 static:{rD:function(a,b,c){var z,y,x,w
-try{x=T.r6(K.ld(a,b),b,c)
+try{x=T.r6(K.Cw(a,b),b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(z),y)}return},r6:function(a,b,c){if(!!J.x(a).$isfk)return J.OS(J.kl(a.bm,new T.bI(a,b)),!1)
+y=new H.XO(w,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(z),y)}return},r6:function(a,b,c){if(!!J.x(a).$isfk)return J.np(J.kl(a.bm,new T.bI(a,b)),!1)
 else return c==null?a:c.$1(a)}}},
 bI:{
-"^":"Xs:30;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){var z=this.a.xG
 if(J.xC(z,"this"))H.vh(K.xn("'this' cannot be used as a variable name."))
-return new K.PO(this.b,z,a)},"$1",null,2,0,null,124,"call"],
+return new K.ig(this.b,z,a)},"$1",null,2,0,null,145,"call"],
 $isEH:true},
 Tg:{
-"^":"Xs:50;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a)+"': "+H.d(a),b)},"$2",null,4,0,null,1,117,"call"],
+"^":"Tp:67;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a)+"': "+H.d(a),b)},"$2",null,4,0,null,1,138,"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 De:{
-"^":"iR;vq,u1,AP,fn",
-vb:function(a,b){this.vq.yI(new B.bX(b,this))},
-$asiR:function(a){return[null]},
-static:{zR:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
+"^":"Sk;vq,u1,AP,fn",
+vb:function(a,b){this.vq.yI(new B.DH(b,this))},
+$asSk:function(a){return[null]},
+static:{z4:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
-bX:{
-"^":"Xs;a,b",
+DH:{
+"^":"Tp;a,b",
 $1:[function(a){var z=this.b
-z.u1=F.Wi(z,C.YI,z.u1,a)},"$1",null,2,0,null,124,"call"],
+z.u1=F.Wi(z,C.zdr,z.u1,a)},"$1",null,2,0,null,145,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
-ld:function(a,b){var z,y
+Cw:function(a,b){var z,y
 z=new P.Sw(null,0,0,0)
 z.$builtinTypeInfo=[null]
 z.Eo(null,null)
-y=J.okV(a,new K.XZ(b,z))
+y=J.okV(a,new K.Oy(b,z))
 J.okV(y,new K.Ed(b))
-return y.gVi()},
+return y.gLv()},
 jX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
@@ -12590,7 +13244,7 @@
 t=z.a.ghP()
 u=J.Vm(z.a.gJn())
 s=!0}else{if(!!v.$isx9){t=w.ghP()
-u=J.tE(z.a)}else if(!!v.$isJy){t=w.ghP()
+u=J.O6(z.a)}else if(!!v.$isNb){t=w.ghP()
 if(J.I1(z.a)!=null){if(z.a.gre()!=null)y.$0()
 u=J.I1(z.a)}else{y.$0()
 u=null}}else{y.$0()
@@ -12599,13 +13253,13 @@
 y=new P.Sw(null,0,0,0)
 y.$builtinTypeInfo=[null]
 y.Eo(null,null)
-q=J.okV(r,new K.XZ(c,y))
+q=J.okV(r,new K.Oy(c,y))
 J.okV(q,new K.Ed(c))
-q.gVi()
-throw H.b(K.xn("filter must implement Transformer: "+H.d(r)))}p=K.ld(t,c)
+q.gLv()
+throw H.b(K.xn("filter must implement Transformer: "+H.d(r)))}p=K.Cw(t,c)
 if(p==null)throw H.b(K.xn("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else{z=$.b7().d8.t(0,u)
+else{z=$.b7().I1.t(0,u)
 $.cp().Cq(p,z,b)}return b},
 xV:function(a,b){var z,y,x
 z=new K.nk(a)
@@ -12616,166 +13270,166 @@
 if(y.x4("this"))H.vh(K.xn("'this' cannot be used as a variable name."))
 y=x}return y},
 lPa:{
-"^":"Xs:50;",
-$2:function(a,b){return J.WB(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){return J.ew(a,b)},
 $isEH:true},
 Ufa:{
-"^":"Xs:50;",
-$2:function(a,b){return J.xH(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){return J.Hn(a,b)},
 $isEH:true},
 Raa:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 w0:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return J.L9(a,b)},
 $isEH:true},
 w5:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w10:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w11:{
-"^":"Xs:50;",
-$2:function(a,b){return J.xZ(a,b)},
+"^":"Tp:67;",
+$2:function(a,b){return J.z8(a,b)},
 $isEH:true},
 w12:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 w13:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 w14:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
 w15:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
 w16:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
 w17:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.$1(a)
 throw H.b(K.xn("Filters must be a one-argument function."))},
 $isEH:true},
 w18:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return a},
 $isEH:true},
 w19:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return J.jzo(a)},
 $isEH:true},
 w20:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:function(a){return a!==!0},
 $isEH:true},
 c4:{
-"^":"Xs:47;a",
+"^":"Tp:64;a",
 $0:function(){return H.vh(K.xn("Expression is not assignable: "+H.d(this.a.a)))},
 $isEH:true},
-PF:{
+GK:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
-$isPF:true,
+$isGK:true,
 $isCo:true,
 $asCo:function(){return[P.qU,P.a]}},
 nk:{
-"^":"PF;ku<",
+"^":"GK;ku<",
 t:function(a,b){var z,y
 if(J.xC(b,"this"))return this.ku
-z=$.b7().d8.t(0,b)
+z=$.b7().I1.t(0,b)
 y=this.ku
 if(y==null||z==null)throw H.b(K.xn("variable '"+H.d(b)+"' not found"))
 y=$.cp().jD(y,z)
-return!!J.x(y).$iscb?B.zR(y,null):y},
-aX:function(a){return!J.xC(a,"this")}},
-PO:{
-"^":"PF;eT>,Z0,P>",
+return!!J.x(y).$iscb?B.z4(y,null):y},
+AC:function(a){return!J.xC(a,"this")}},
+ig:{
+"^":"GK;eT>,Z0,P>",
 gku:function(){return this.eT.gku()},
 t:function(a,b){var z
 if(J.xC(this.Z0,b)){z=this.P
-return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
-aX:function(a){if(J.xC(this.Z0,a))return!1
-return this.eT.aX(a)}},
+return!!J.x(z).$iscb?B.z4(z,null):z}return this.eT.t(0,b)},
+AC:function(a){if(J.xC(this.Z0,a))return!1
+return this.eT.AC(a)}},
 Ph:{
-"^":"PF;eT>,Z3<",
+"^":"GK;eT>,Z3<",
 gku:function(){return this.eT.ku},
 t:function(a,b){var z=this.Z3
 if(z.x4(b)){z=z.t(0,b)
-return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
-aX:function(a){if(this.Z3.x4(a))return!1
+return!!J.x(z).$iscb?B.z4(z,null):z}return this.eT.t(0,b)},
+AC:function(a){if(this.Z3.x4(a))return!1
 return!J.xC(a,"this")}},
 dE:{
-"^":"a;KX?,Vi<",
-glr:function(){var z=this.BM
+"^":"a;bO?,Lv<",
+glr:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gK3:function(){return this.Vi},
-PJ:function(a){},
-b9:function(a){var z
-this.oO(a)
-z=this.KX
-if(z!=null)z.b9(a)},
-oO:function(a){var z,y,x
-z=this.kP
+gXr:function(){return this.Lv},
+Qh:function(a){},
+l8:function(a){var z
+this.OJ(a)
+z=this.bO
+if(z!=null)z.l8(a)},
+OJ:function(a){var z,y,x
+z=this.tj
 if(z!=null){z.ed()
-this.kP=null}y=this.Vi
-this.PJ(a)
-z=this.Vi
-if(z==null?y!=null:z!==y){x=this.BM
+this.tj=null}y=this.Lv
+this.Qh(a)
+z=this.Lv
+if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
 x.Iv(z)}},
-bu:function(a){return this.mA.bu(0)},
+bu:function(a){return this.KL.bu(0)},
 $isdE:true,
 $ishw:true},
 Ed:{
 "^":"cfS;qu",
-xn:function(a){a.oO(this.qu)},
+xn:function(a){a.OJ(this.qu)},
 ky:function(a){J.okV(a.gT8(a),this)
-a.oO(this.qu)}},
-XZ:{
+a.OJ(this.qu)}},
+Oy:{
 "^":"Jg;qu,lk",
 W9:function(a){return new K.uD(a,null,null,null,P.bK(null,null,!1,null))},
 LT:function(a){return a.wz.RR(0,this)},
-T7:function(a){var z,y
+fV:function(a){var z,y
 z=J.okV(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sKX(y)
+z.sbO(y)
 return y},
 CU:function(a){var z,y,x
 z=J.okV(a.ghP(),this)
 y=J.okV(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sKX(x)
-y.sKX(x)
+z.sbO(x)
+y.sbO(x)
 return x},
-og:function(a){var z,y,x,w,v
+ZR:function(a){var z,y,x,w,v
 z=J.okV(a.ghP(),this)
 if(a.gre()==null)y=null
 else{x=a.gre()
 w=this.gnG()
 x.toString
 y=H.VM(new H.lJ(x,w),[null,null]).tt(0,!1)}v=new K.xJ(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sKX(v)
-if(y!=null)H.bQ(y,new K.o4(v))
+z.sbO(v)
+if(y!=null)H.bQ(y,new K.zD(v))
 return v},
 oD:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
 z=H.VM(new H.lJ(a.ghL(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.kL(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.XV(y))
+H.bQ(z,new K.Gzk(y))
 return y},
 o0:function(a){var z,y
 z=H.VM(new H.lJ(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
@@ -12786,270 +13440,270 @@
 z=J.okV(a.gG3(a),this)
 y=J.okV(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sKX(x)
-y.sKX(x)
+z.sbO(x)
+y.sbO(x)
 return x},
 qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
 x=new K.iv(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sKX(x)
-y.sKX(x)
+z.sbO(x)
+y.sbO(x)
 return x},
 Hx:function(a){var z,y
 z=J.okV(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sKX(y)
+z.sbO(y)
 return y},
 RD:function(a){var z,y,x,w
 z=J.okV(a.gdc(),this)
 y=J.okV(a.gSl(),this)
 x=J.okV(a.gru(),this)
-w=new K.dD(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sKX(w)
-y.sKX(w)
-x.sKX(w)
+w=new K.an(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
+z.sbO(w)
+y.sbO(w)
+x.sbO(w)
 return w},
 ky:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
-y.sKX(x)
+y.sbO(x)
 return x}},
-o4:{
-"^":"Xs:30;a",
+zD:{
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
-a.sKX(z)
+a.sbO(z)
 return z},
 $isEH:true},
-XV:{
-"^":"Xs:30;a",
+Gzk:{
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
-a.sKX(z)
+a.sbO(z)
 return z},
 $isEH:true},
 B8:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
-a.sKX(z)
+a.sbO(z)
 return z},
 $isEH:true},
 uD:{
-"^":"dE;mA,KX,kP,Vi,BM",
-PJ:function(a){this.Vi=a.gku()},
+"^":"dE;KL,bO,tj,Lv,k6",
+Qh:function(a){this.Lv=a.gku()},
 RR:function(a,b){return b.W9(this)},
 $asdE:function(){return[U.WH]},
 $isWH:true,
 $ishw:true},
 z0:{
-"^":"dE;mA,KX,kP,Vi,BM",
-gP:function(a){var z=this.mA
+"^":"dE;KL,bO,tj,Lv,k6",
+gP:function(a){var z=this.KL
 return z.gP(z)},
-PJ:function(a){var z=this.mA
-this.Vi=z.gP(z)},
+Qh:function(a){var z=this.KL
+this.Lv=z.gP(z)},
 RR:function(a,b){return b.oD(this)},
 $asdE:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 kL:{
-"^":"dE;hL<,mA,KX,kP,Vi,BM",
-PJ:function(a){this.Vi=H.VM(new H.lJ(this.hL,new K.Hv()),[null,null]).tt(0,!1)},
+"^":"dE;hL<,KL,bO,tj,Lv,k6",
+Qh:function(a){this.Lv=H.VM(new H.lJ(this.hL,new K.Hv()),[null,null]).tt(0,!1)},
 RR:function(a,b){return b.Zh(this)},
 $asdE:function(){return[U.c0]},
 $isc0:true,
 $ishw:true},
 Hv:{
-"^":"Xs:30;",
-$1:[function(a){return a.gVi()},"$1",null,2,0,null,124,"call"],
+"^":"Tp:10;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,145,"call"],
 $isEH:true},
 ev:{
-"^":"dE;Rl>,mA,KX,kP,Vi,BM",
-PJ:function(a){this.Vi=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Xv())},
+"^":"dE;Rl>,KL,bO,tj,Lv,k6",
+Qh:function(a){this.Lv=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
 RR:function(a,b){return b.o0(this)},
 $asdE:function(){return[U.Qb]},
 $isQb:true,
 $ishw:true},
-Xv:{
-"^":"Xs:50;",
-$2:function(a,b){J.kW(a,J.Kt(b).gVi(),b.gv4().gVi())
+Ku:{
+"^":"Tp:67;",
+$2:function(a,b){J.kW(a,J.Kt(b).gLv(),b.gv4().gLv())
 return a},
 $isEH:true},
 qR:{
-"^":"dE;G3>,v4<,mA,KX,kP,Vi,BM",
+"^":"dE;G3>,v4<,KL,bO,tj,Lv,k6",
 RR:function(a,b){return b.YV(this)},
 $asdE:function(){return[U.ae]},
 $isae:true,
 $ishw:true},
 ek:{
-"^":"dE;mA,KX,kP,Vi,BM",
-gP:function(a){var z=this.mA
+"^":"dE;KL,bO,tj,Lv,k6",
+gP:function(a){var z=this.KL
 return z.gP(z)},
-PJ:function(a){var z,y,x,w
-z=this.mA
-this.Vi=a.t(0,z.gP(z))
-if(!a.aX(z.gP(z)))return
+Qh:function(a){var z,y,x,w
+z=this.KL
+this.Lv=a.t(0,z.gP(z))
+if(!a.AC(z.gP(z)))return
 y=a.gku()
 x=J.x(y)
 if(!x.$isd3)return
 z=z.gP(z)
-w=$.b7().d8.t(0,z)
-this.kP=x.gqh(y).yI(new K.OC(this,a,w))},
+w=$.b7().I1.t(0,z)
+this.tj=x.gqh(y).yI(new K.OC(this,a,w))},
 RR:function(a,b){return b.qv(this)},
 $asdE:function(){return[U.elO]},
 $iselO:true,
 $ishw:true},
 OC:{
-"^":"Xs:30;a,b,c",
-$1:[function(a){if(J.xq(a,new K.av(this.c))===!0)this.a.b9(this.b)},"$1",null,2,0,null,125,"call"],
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.GC(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
-av:{
-"^":"Xs:30;d",
+GC:{
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 mv:{
-"^":"dE;wz<,mA,KX,kP,Vi,BM",
-gxS:function(a){var z=this.mA
+"^":"dE;wz<,KL,bO,tj,Lv,k6",
+gxS:function(a){var z=this.KL
 return z.gxS(z)},
-PJ:function(a){var z,y
-z=this.mA
-y=$.fs().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"!")){z=this.wz.gVi()
-this.Vi=y.$1(z==null?!1:z)}else{z=this.wz
-this.Vi=z.gVi()==null?null:y.$1(z.gVi())}},
+Qh:function(a){var z,y
+z=this.KL
+y=$.qL().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"!")){z=this.wz.gLv()
+this.Lv=y.$1(z==null?!1:z)}else{z=this.wz
+this.Lv=z.gLv()==null?null:y.$1(z.gLv())}},
 RR:function(a,b){return b.Hx(this)},
 $asdE:function(){return[U.cJ]},
 $iscJ:true,
 $ishw:true},
 iv:{
-"^":"dE;Bb>,T8>,mA,KX,kP,Vi,BM",
-gxS:function(a){var z=this.mA
+"^":"dE;Bb>,T8>,KL,bO,tj,Lv,k6",
+gxS:function(a){var z=this.KL
 return z.gxS(z)},
-PJ:function(a){var z,y,x
-z=this.mA
+Qh:function(a){var z,y,x
+z=this.KL
 y=$.Jl().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gVi()
+if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gLv()
 if(z==null)z=!1
-x=this.T8.gVi()
-this.Vi=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.Vi=y.$2(this.Bb.gVi(),this.T8.gVi())
+x=this.T8.gLv()
+this.Lv=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.Lv=y.$2(this.Bb.gLv(),this.T8.gLv())
 else{x=this.Bb
-if(x.gVi()==null||this.T8.gVi()==null)this.Vi=null
-else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gVi()).$iswn)this.kP=H.Go(x.gVi(),"$iswn").gRT().yI(new K.P8(this,a))
-this.Vi=y.$2(x.gVi(),this.T8.gVi())}}},
+if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
+else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gRT().yI(new K.P8(this,a))
+this.Lv=y.$2(x.gLv(),this.T8.gLv())}}},
 RR:function(a,b){return b.ex(this)},
 $asdE:function(){return[U.Mp]},
 $isMp:true,
 $ishw:true},
 P8:{
-"^":"Xs:30;a,b",
-$1:[function(a){return this.a.b9(this.b)},"$1",null,2,0,null,81,"call"],
+"^":"Tp:10;a,b",
+$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
-dD:{
-"^":"dE;dc<,Sl<,ru<,mA,KX,kP,Vi,BM",
-PJ:function(a){var z=this.dc.gVi()
-this.Vi=(z==null?!1:z)===!0?this.Sl.gVi():this.ru.gVi()},
+an:{
+"^":"dE;dc<,Sl<,ru<,KL,bO,tj,Lv,k6",
+Qh:function(a){var z=this.dc.gLv()
+this.Lv=(z==null?!1:z)===!0?this.Sl.gLv():this.ru.gLv()},
 RR:function(a,b){return b.RD(this)},
 $asdE:function(){return[U.HB]},
 $isHB:true,
 $ishw:true},
 vl:{
-"^":"dE;hP<,mA,KX,kP,Vi,BM",
-goc:function(a){var z=this.mA
+"^":"dE;hP<,KL,bO,tj,Lv,k6",
+goc:function(a){var z=this.KL
 return z.goc(z)},
-PJ:function(a){var z,y,x
-z=this.hP.gVi()
-if(z==null){this.Vi=null
-return}y=this.mA
+Qh:function(a){var z,y,x
+z=this.hP.gLv()
+if(z==null){this.Lv=null
+return}y=this.KL
 y=y.goc(y)
-x=$.b7().d8.t(0,y)
-this.Vi=$.cp().jD(z,x)
+x=$.b7().I1.t(0,y)
+this.Lv=$.cp().jD(z,x)
 y=J.x(z)
-if(!!y.$isd3)this.kP=y.gqh(z).yI(new K.Zu(this,a,x))},
-RR:function(a,b){return b.T7(this)},
+if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.e9n(this,a,x))},
+RR:function(a,b){return b.fV(this)},
 $asdE:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
-Zu:{
-"^":"Xs:30;a,b,c",
-$1:[function(a){if(J.xq(a,new K.WKb(this.c))===!0)this.a.b9(this.b)},"$1",null,2,0,null,125,"call"],
+e9n:{
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.WKb(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 WKb:{
-"^":"Xs:30;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 iT:{
-"^":"dE;hP<,Jn<,mA,KX,kP,Vi,BM",
-PJ:function(a){var z,y,x
-z=this.hP.gVi()
-if(z==null){this.Vi=null
-return}y=this.Jn.gVi()
+"^":"dE;hP<,Jn<,KL,bO,tj,Lv,k6",
+Qh:function(a){var z,y,x
+z=this.hP.gLv()
+if(z==null){this.Lv=null
+return}y=this.Jn.gLv()
 x=J.U6(z)
-this.Vi=x.t(z,y)
-if(!!x.$isd3)this.kP=x.gqh(z).yI(new K.z5(this,a,y))},
+this.Lv=x.t(z,y)
+if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.tE(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asdE:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
-z5:{
-"^":"Xs:30;a,b,c",
-$1:[function(a){if(J.xq(a,new K.ey(this.c))===!0)this.a.b9(this.b)},"$1",null,2,0,null,125,"call"],
+tE:{
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.ey(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 ey:{
-"^":"Xs:30;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.d)},
 $isEH:true},
 xJ:{
-"^":"dE;hP<,re<,mA,KX,kP,Vi,BM",
-gSf:function(a){var z=this.mA
+"^":"dE;hP<,re<,KL,bO,tj,Lv,k6",
+gSf:function(a){var z=this.KL
 return z.gSf(z)},
-PJ:function(a){var z,y,x,w
+Qh:function(a){var z,y,x,w
 z=this.re
 z.toString
 y=H.VM(new H.lJ(z,new K.WW()),[null,null]).br(0)
-x=this.hP.gVi()
-if(x==null){this.Vi=null
-return}z=this.mA
+x=this.hP.gLv()
+if(x==null){this.Lv=null
+return}z=this.KL
 if(z.gSf(z)==null){z=H.im(x,y,P.Te(null))
-this.Vi=!!J.x(z).$iscb?B.zR(z,null):z}else{z=z.gSf(z)
-w=$.b7().d8.t(0,z)
-this.Vi=$.cp().Ck(x,w,y,!1,null)
+this.Lv=!!J.x(z).$iscb?B.z4(z,null):z}else{z=z.gSf(z)
+w=$.b7().I1.t(0,z)
+this.Lv=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.kP=z.gqh(x).yI(new K.vQ(this,a,w))}},
-RR:function(a,b){return b.og(this)},
-$asdE:function(){return[U.Jy]},
-$isJy:true,
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.vQ(this,a,w))}},
+RR:function(a,b){return b.ZR(this)},
+$asdE:function(){return[U.Nb]},
+$isNb:true,
 $ishw:true},
 WW:{
-"^":"Xs:30;",
-$1:[function(a){return a.gVi()},"$1",null,2,0,null,22,"call"],
+"^":"Tp:10;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,43,"call"],
 $isEH:true},
 vQ:{
-"^":"Xs:136;a,b,c",
-$1:[function(a){if(J.xq(a,new K.ho(this.c))===!0)this.a.b9(this.b)},"$1",null,2,0,null,125,"call"],
+"^":"Tp:157;a,b,c",
+$1:[function(a){if(J.xq(a,new K.ho(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 ho:{
-"^":"Xs:30;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 VA:{
-"^":"dE;Bb>,T8>,mA,KX,kP,Vi,BM",
-PJ:function(a){var z,y,x,w
+"^":"dE;Bb>,T8>,KL,bO,tj,Lv,k6",
+Qh:function(a){var z,y,x,w
 z=this.Bb
-y=this.T8.gVi()
+y=this.T8.gLv()
 x=J.x(y)
-if(!x.$iscX&&y!=null)throw H.b(K.xn("right side of 'in' is not an iterator"))
-if(!!x.$iswn)this.kP=y.gRT().yI(new K.J1(this,a))
+if(!x.$isQV&&y!=null)throw H.b(K.xn("right side of 'in' is not an iterator"))
+if(!!x.$iswn)this.tj=y.gRT().yI(new K.OF(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Vi=new K.fk(x,w)},
+this.Lv=new K.fk(x,w)},
 RR:function(a,b){return b.ky(this)},
-$asdE:function(){return[U.Cu]},
-$isCu:true,
+$asdE:function(){return[U.ma]},
+$isma:true,
 $ishw:true},
-J1:{
-"^":"Xs:30;a,b",
-$1:[function(a){return this.a.b9(this.b)},"$1",null,2,0,null,81,"call"],
+OF:{
+"^":"Tp:10;a,b",
+$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 fk:{
 "^":"a;xG,bm",
@@ -13067,19 +13721,19 @@
 if(z>=b.length)return H.e(b,z)
 if(!J.xC(y,b[z]))return!1}return!0},
 b1:function(a){a.toString
-return U.OT(H.n3(a,0,new U.xs()))},
-Zd:function(a,b){var z=J.WB(a,b)
+return U.Le(H.n3(a,0,new U.xs()))},
+Zd:function(a,b){var z=J.ew(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
-OT:function(a){if(typeof a!=="number")return H.s(a)
+Le: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)},
-Fs:{
+tu:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,137,1,22]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,158,1,43]},
 hw:{
 "^":"a;",
 $ishw:true},
@@ -13127,16 +13781,16 @@
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
-return U.OT(U.Zd(U.Zd(0,z),y))},
+return U.Le(U.Zd(U.Zd(0,z),y))},
 $isae:true},
-Iq:{
+XC:{
 "^":"hw;wz",
 RR:function(a,b){return b.LT(this)},
 bu:function(a){return"("+H.d(this.wz)+")"},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isIq&&J.xC(b.wz,this.wz)},
+return!!J.x(b).$isXC&&J.xC(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
-$isIq:true},
+$isXC:true},
 elO:{
 "^":"hw;P>",
 RR:function(a,b){return b.qv(this)},
@@ -13158,7 +13812,7 @@
 giO:function(a){var z,y
 z=J.v1(this.xS)
 y=J.v1(this.wz)
-return U.OT(U.Zd(U.Zd(0,z),y))},
+return U.Le(U.Zd(U.Zd(0,z),y))},
 $iscJ:true},
 Mp:{
 "^":"hw;xS>,Bb>,T8>",
@@ -13172,7 +13826,7 @@
 z=J.v1(this.xS)
 y=J.v1(this.Bb)
 x=J.v1(this.T8)
-return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
+return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
 $isMp:true},
 HB:{
 "^":"hw;dc<,Sl<,ru<",
@@ -13184,22 +13838,22 @@
 z=J.v1(this.dc)
 y=J.v1(this.Sl)
 x=J.v1(this.ru)
-return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
+return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
 $isHB:true},
-Cu:{
+ma:{
 "^":"hw;Bb>,T8>",
 RR:function(a,b){return b.ky(this)},
 bu:function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isCu&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+return!!z.$isma&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
 y=J.v1(this.T8)
-return U.OT(U.Zd(U.Zd(0,z),y))},
-$isCu:true},
+return U.Le(U.Zd(U.Zd(0,z),y))},
+$isma:true},
 zX:{
 "^":"hw;hP<,Jn<",
 RR:function(a,b){return b.CU(this)},
@@ -13209,11 +13863,11 @@
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
-return U.OT(U.Zd(U.Zd(0,z),y))},
+return U.Le(U.Zd(U.Zd(0,z),y))},
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:function(a,b){return b.T7(this)},
+RR:function(a,b){return b.fV(this)},
 bu:function(a){return H.d(this.hP)+"."+H.d(this.oc)},
 n:function(a,b){var z
 if(b==null)return!1
@@ -13222,59 +13876,59 @@
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
-return U.OT(U.Zd(U.Zd(0,z),y))},
+return U.Le(U.Zd(U.Zd(0,z),y))},
 $isx9:true},
-Jy:{
+Nb:{
 "^":"hw;hP<,Sf>,re<",
-RR:function(a,b){return b.og(this)},
+RR:function(a,b){return b.ZR(this)},
 bu:function(a){return H.d(this.hP)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isJy&&J.xC(b.ghP(),this.hP)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
+return!!z.$isNb&&J.xC(b.ghP(),this.hP)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
 y=J.v1(this.Sf)
 x=U.b1(this.re)
-return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
-$isJy:true},
+return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
+$isNb:true},
 xs:{
-"^":"Xs:50;",
+"^":"Tp:67;",
 $2:function(a,b){return U.Zd(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
 "^":"a;rp,AO,mV,vi",
 gQi:function(){return this.vi.lo},
-zM:function(a,b){var z
+HA:function(a,b){var z
 if(a!=null){z=this.vi.lo
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
 if(!z)if(b!=null){z=this.vi.lo
 z=z==null||!J.xC(J.Vm(z),b)}else z=!1
 else z=!0
-if(z)throw H.b(Y.B3("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
+if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
 this.vi.G()},
-Bp:function(){return this.zM(null,null)},
-GI:function(a){return this.zM(a,null)},
+Bp:function(){return this.HA(null,null)},
+GI:function(a){return this.HA(a,null)},
 Te:function(){if(this.vi.lo==null){this.rp.toString
 return C.x4}var z=this.Yq()
-return z==null?null:this.FH(z,0)},
-FH:function(a,b){var z,y,x,w,v,u
+return z==null?null:this.tF(z,0)},
+tF:function(a,b){var z,y,x,w,v,u
 for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.GN()
 this.rp.toString
-a=new U.Jy(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
+a=new U.Nb(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
 this.rp.toString
 a=new U.zX(a,x)}else break
 else if(J.xC(J.Iz(this.vi.lo),3)){this.Bp()
-a=this.j6(a,this.Yq())}else if(J.xC(J.Iz(this.vi.lo),10)&&J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.B3("in... statements must start with an identifier"))
+a=this.j6(a,this.Yq())}else if(J.xC(J.Iz(this.vi.lo),10)&&J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.RV("in... statements must start with an identifier"))
 this.Bp()
 w=this.Te()
 this.rp.toString
-a=new U.Cu(a,w)}else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
+a=new U.ma(a,w)}else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.zM(8,"?")
+if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.HA(8,"?")
 v=this.Te()
 this.GI(5)
 u=this.Te()
@@ -13285,10 +13939,10 @@
 z=J.x(b)
 if(!!z.$iselO){z=z.gP(b)
 this.rp.toString
-return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$iselO){z=J.Vm(b.ghP())
+return new U.x9(a,z)}else if(!!z.$isNb&&!!J.x(b.ghP()).$iselO){z=J.Vm(b.ghP())
 y=b.gre()
 this.rp.toString
-return new U.Jy(a,z,y)}else throw H.b(Y.B3("expected identifier: "+H.d(b)))},
+return new U.Nb(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
 ZJ:function(a){var z,y,x,w
 z=this.vi.lo
 this.Bp()
@@ -13302,7 +13956,7 @@
 x=w}else x=!1
 else x=!1
 if(!x)break
-y=this.FH(y,this.vi.lo.gP9())}x=J.Vm(z)
+y=this.tF(y,this.vi.lo.gP9())}x=J.Vm(z)
 this.rp.toString
 return new U.Mp(x,a,y)},
 Yq:function(){var z,y,x,w
@@ -13320,10 +13974,10 @@
 z=new U.no(x)
 z.$builtinTypeInfo=[null]
 this.Bp()
-return z}else{w=this.FH(this.yL(),11)
+return z}else{w=this.tF(this.yL(),11)
 y.toString
 return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
-w=this.FH(this.yL(),11)
+w=this.tF(this.yL(),11)
 this.rp.toString
 return new U.cJ(z,w)}}return this.yL()},
 yL:function(){var z,y,x
@@ -13339,9 +13993,9 @@
 case 7:return this.Xk()
 case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
 x=this.Te()
-this.zM(9,")")
+this.HA(9,")")
 this.rp.toString
-return new U.Iq(x)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
+return new U.XC(x)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
 else if(J.xC(J.Vm(this.vi.lo),"["))return this.S9()
 return
 case 5:throw H.b(P.u("unexpected token \":\""))
@@ -13352,7 +14006,7 @@
 if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"]"))break
 z.push(this.Te())
 y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.zM(9,"]")
+this.HA(9,"]")
 return new U.c0(z)},
 pH:function(){var z,y,x
 z=[]
@@ -13363,10 +14017,10 @@
 x=new U.no(y)
 x.$builtinTypeInfo=[null]
 this.Bp()
-this.zM(5,":")
+this.HA(5,":")
 z.push(new U.ae(x,this.Te()))
 y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.zM(9,"}")
+this.HA(9,"}")
 return new U.Qb(z)},
 qK:function(){var z,y,x
 if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
@@ -13375,14 +14029,14 @@
 this.rp.toString
 return H.VM(new U.no(!1),[null])}if(J.xC(J.Vm(this.vi.lo),"null")){this.Bp()
 this.rp.toString
-return H.VM(new U.no(null),[null])}if(!J.xC(J.Iz(this.vi.lo),2))H.vh(Y.B3("expected identifier: "+H.d(this.gQi())+".value"))
+return H.VM(new U.no(null),[null])}if(!J.xC(J.Iz(this.vi.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gQi())+".value"))
 z=J.Vm(this.vi.lo)
 this.Bp()
 this.rp.toString
 y=new U.elO(z)
 x=this.GN()
 if(x==null)return y
-else return new U.Jy(y,null,x)},
+else return new U.Nb(y,null,x)},
 GN:function(){var z,y
 z=this.vi.lo
 if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"(")){y=[]
@@ -13390,13 +14044,13 @@
 if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),")"))break
 y.push(this.Te())
 z=this.vi.lo}while(z!=null&&J.xC(J.Vm(z),","))
-this.zM(9,")")
+this.HA(9,")")
 return y}return},
 Ew:function(){var z,y
 z=this.vi.lo
 if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"[")){this.Bp()
 y=this.Te()
-this.zM(9,"]")
+this.HA(9,"]")
 return y}return},
 ef:function(){var z,y
 z=J.Vm(this.vi.lo)
@@ -13404,13 +14058,13 @@
 y=H.VM(new U.no(z),[null])
 this.Bp()
 return y},
-iV:function(a){var z,y
+Nt:function(a){var z,y
 z=H.BU(H.d(a)+H.d(J.Vm(this.vi.lo)),null,null)
 this.rp.toString
 y=H.VM(new U.no(z),[null])
 this.Bp()
 return y},
-DS:function(){return this.iV("")},
+DS:function(){return this.Nt("")},
 u3:function(a){var z,y
 z=H.RR(H.d(a)+H.d(J.Vm(this.vi.lo)),null)
 this.rp.toString
@@ -13419,7 +14073,7 @@
 return y},
 Xk:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","G5",2,0,43,44],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","G5",2,0,61,62],
 O1:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
@@ -13433,23 +14087,23 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return J.q8(this.F5)},
-gl0:function(a){return J.FN(this.F5)},
+gl0:function(a){return J.tx(this.F5)},
 grZ:function(a){var z,y
 z=this.F5
 y=J.U6(z)
-z=new K.O1(J.xH(y.gB(z),1),y.grZ(z))
+z=new K.O1(J.Hn(y.gB(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a){return[[K.O1,a]]},
-$ascX:function(a){return[[K.O1,a]]}},
+$asQV:function(a){return[[K.O1,a]]}},
 vR:{
-"^":"AC;Tr,Mv,Ta",
+"^":"Yl;Tr,Mv,Ta",
 gl:function(){return this.Ta},
 G:function(){var z=this.Tr
 if(z.G()){this.Ta=H.VM(new K.O1(this.Mv++,z.gl()),[null])
 return!0}this.Ta=null
 return!1},
-$asAC:function(a){return[[K.O1,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+$asYl:function(a){return[[K.O1,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 Ox:function(a){switch(a){case 102:return 12
 case 110:return 10
@@ -13483,7 +14137,7 @@
 x=z.G()?z.Wn:null
 this.x0=x
 if(C.Nm.tg(C.bg,x)){x=this.x0
-u=H.eT([v,x])
+u=H.BZ([v,x])
 if(C.Nm.tg(C.G8,u)){this.x0=z.G()?z.Wn:null
 t=u}else t=H.Lw(v)}else t=H.Lw(v)
 y.push(new Y.qS(8,t,C.Mk.t(0,t)))}else if(C.Nm.tg(C.ML,this.x0)){s=H.Lw(this.x0)
@@ -13494,10 +14148,10 @@
 y=this.jI
 x=y.G()?y.Wn:null
 this.x0=x
-for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.B3("unterminated string"))
+for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
 if(x===92){x=y.G()?y.Wn:null
 this.x0=x
-if(x==null)throw H.b(Y.B3("unterminated string"))
+if(x==null)throw H.b(Y.RV("unterminated string"))
 x=H.Lw(Y.Ox(x))
 w.vM+=x}else{x=H.Lw(x)
 w.vM+=x}x=y.G()?y.Wn:null
@@ -13550,23 +14204,23 @@
 hA:{
 "^":"a;G1>",
 bu:function(a){return"ParseException: "+this.G1},
-static:{B3:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
+static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
 "^":"",
 Jg:{
 "^":"a;",
-DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,138,117]},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,159,138]},
 cfS:{
 "^":"Jg;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
 LT:function(a){a.wz.RR(0,this)
 this.xn(a)},
-T7:function(a){J.okV(a.ghP(),this)
+fV:function(a){J.okV(a.ghP(),this)
 this.xn(a)},
 CU:function(a){J.okV(a.ghP(),this)
 J.okV(a.gJn(),this)
 this.xn(a)},
-og:function(a){var z
+ZR:function(a){var z
 J.okV(a.ghP(),this)
 if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
@@ -13595,11 +14249,11 @@
 this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 qZ:{
-"^":"V29;GF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V39;GF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 giJ:function(a){return a.GF},
 siJ:function(a,b){a.GF=this.ct(a,C.j2,a.GF,b)},
 static:{RH:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -13607,17 +14261,17 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.Cc.ZL(a)
-C.Cc.XI(a)
+C.Vp.ZL(a)
+C.Vp.XI(a)
 return a}}},
-V29:{
+V39:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
-Uy:{
-"^":"V30;Ny,GR,cI,FZ,Kf,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gtu:function(a){return a.Ny},
-stu:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
+ov:{
+"^":"V40;Ny,GR,cI,FZ,Kf,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gIs:function(a){return a.Ny},
+sIs:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
 gBV:function(a){return a.GR},
 sBV:function(a,b){a.GR=this.ct(a,C.tW,a.GR,b)},
 gMl:function(a){return a.cI},
@@ -13626,31 +14280,31 @@
 sqw:function(a,b){a.FZ=this.ct(a,C.WZ,a.FZ,b)},
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-rh:[function(a,b){this.VH(a)
-this.ct(a,C.wq,0,1)},"$1","grO",2,0,15,34],
-fX:[function(a,b){this.VH(a)},"$1","gXN",2,0,15,34],
+rh:[function(a,b){this.Kn(a)
+this.ct(a,C.wq,0,1)},"$1","grO",2,0,17,54],
+fX:[function(a,b){this.Kn(a)},"$1","gIF",2,0,17,54],
 xx:[function(a,b){this.ct(a,C.SA,0,1)
-this.ct(a,C.wq,0,1)},"$1","gTA",2,0,30,34],
+this.ct(a,C.wq,0,1)},"$1","gTA",2,0,10,54],
 fT:[function(a,b){var z,y
 z=a.Ny
 if(z==null||a.FZ!==!0)return"min-width:32px;"
 y=z.gu9().Zp.t(0,b.gRd())
 if(y==null)return"min-width:32px;"
 if(J.xC(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,139,140],
-VH:function(a){var z,y,x,w,v
-if(J.zg(a.Ny)!==!0){J.SK(a.Ny).ml(new T.Wd(a))
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,160,161],
+Kn:function(a){var z,y,x,w,v
+if(J.iS(a.Ny)!==!0){J.SK(a.Ny).ml(new T.Wd(a))
 return}this.ct(a,C.SA,0,1)
 J.U2(a.Kf)
 z=a.Ny.q6(a.GR)
 if(z!=null){y=a.cI
 x=a.Ny
-if(y==null)J.bi(a.Kf,J.UQ(J.de(x),J.xH(z,1)))
+if(y==null)J.bi(a.Kf,J.UQ(J.de(x),J.Hn(z,1)))
 else{w=x.q6(y)
 for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),y.W(v,1)))}}},
 static:{"^":"bN,MRW,VnP",Zz:function(a){var z,y,x,w,v
 z=R.tB([])
-y=$.Nd()
+y=$.XZ()
 x=P.YM(null,null,null,P.qU,W.I0)
 w=P.qU
 v=W.h4
@@ -13663,40 +14317,40 @@
 C.oA.ZL(a)
 C.oA.XI(a)
 return a}}},
-V30:{
+V40:{
 "^":"uL+Pi;",
 $isd3:true},
 Wd:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=this.a
-if(J.zg(z.Ny)===!0)J.NO(z)},"$1",null,2,0,null,81,"call"],
+if(J.iS(z.Ny)===!0)J.vH(z)},"$1",null,2,0,null,11,"call"],
 $isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 kn:{
-"^":"ZzR;jJ,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gBV:function(a){return a.jJ},
 sBV:function(a,b){a.jJ=this.ct(a,C.tW,a.jJ,b)},
 gJp:function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gJp.call(this,a)
 return z.gzz()},
-fX:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,15,34],
+fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,17,54],
 r6:[function(a,b){var z=a.tY
-if(z!=null&&J.zg(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,15,81],
+if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,17,11],
 goc:function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
-if(J.J5(a.jJ,0)){z=J.zg(a.tY)
+if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
 else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},
 gO3:function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
-if(J.J5(a.jJ,0)){z=J.zg(a.tY)
+if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
 else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},
 static:{D2:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -13709,14 +14363,14 @@
 C.Mh.ZL(a)
 C.Mh.XI(a)
 return a}}},
-ZzR:{
+oEY:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":"V31;Uz,HJ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gtu:function(a){return a.Uz},
-stu:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
+"^":"V41;Uz,HJ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gIs:function(a){return a.Uz},
+sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 gnN:function(a){return a.HJ},
 snN:function(a,b){a.HJ=this.ct(a,C.XY,a.HJ,b)},
 q0:function(a){var z
@@ -13724,11 +14378,11 @@
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-RB:[function(a,b){J.Zg((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gVU",2,0,30,34],
-RF:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,15,65],
-j9:[function(a,b){J.y9(J.aT(a.Uz)).wM(b)},"$1","gWp",2,0,15,65],
-static:{UF:function(a){var z,y,x,w
-z=$.Nd()
+ii:[function(a,b){J.qA((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gVU",2,0,10,54],
+RF:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,17,82],
+j9:[function(a,b){J.y9(J.aT(a.Uz)).wM(b)},"$1","gWp",2,0,17,82],
+static:{TXt:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -13740,7 +14394,7 @@
 C.FH.ZL(a)
 C.FH.XI(a)
 return a}}},
-V31:{
+V41:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
@@ -13826,54 +14480,53 @@
 v.$builtinTypeInfo=[z,w]
 s=new D.vx(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
+case"Socket":s=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+break
 default:z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
 s=new D.vO(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
-bF:function(a){var z
+D5:function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
 return z},
 tg:function(a,b){var z=J.x(a)
 if(!!z.$isvO)return
-if(!!z.$isqC)D.Gf(a,b)
+if(!!z.$isqC)D.yX(a,b)
 else if(!!z.$iswn)D.f3(a,b)},
-Gf:function(a,b){a.aN(0,new D.UZ(a,b))},
+yX:function(a,b){a.aN(0,new D.Qf(a,b))},
 f3:function(a,b){var z,y,x,w,v,u
-for(z=a.Jo,y=0;y<z.length;++y){x=z[y]
+for(z=a.ao,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
 if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
 else u=!1
 if(u)a.u(0,y,b.Qn(x))
 else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},
+else if(v)D.yX(x,b)}},
 af:{
-"^":"Pi;NM@,t7@",
+"^":"Pi;px@,t7@",
 gwv:function(a){var z=this.Jz
 return z.gwv(z)},
 god:function(a){var z=this.Jz
 return z.god(z)},
 gjO:function(a){return this.r0},
 gzS:function(){return this.mQ},
-gPj:function(a){var z,y
-z=this.god(this)
-y=this.r0
-return H.d(z.r0)+"/"+H.d(y)},
+gPj:function(a){return this.Jz.Mq(this.r0)},
 gHP:function(){return"#/"+H.d(this.gPj(this))},
 sHP:function(a){},
-glQ:function(a){return this.kT},
+gox:function(a){return this.Sa},
 gUm:function(){return!1},
 gfS:function(){return!1},
-goc:function(a){return this.gNM()},
-soc:function(a,b){this.sNM(this.ct(this,C.YS,this.gNM(),b))},
+goc:function(a){return this.gpx()},
+soc:function(a,b){this.spx(this.ct(this,C.YS,this.gpx(),b))},
 gzz:function(){return this.gt7()},
 szz:function(a){this.st7(this.ct(this,C.Tc,this.gt7(),a))},
-xW:function(a){if(this.kT)return P.PG(this,null)
+xW:function(a){if(this.Sa)return P.PG(this,null)
 return this.VD(0)},
 VD:function(a){var z
 if(J.xC(this.r0,""))return P.PG(this,null)
-if(this.kT&&this.gfS())return P.PG(this,null)
+if(this.Sa&&this.gfS())return P.PG(this,null)
 z=this.VR
 if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.Pa(this)).wM(new D.jI(this))
 this.VR=z}return z},
@@ -13889,7 +14542,7 @@
 this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Xs:142;a",
+"^":"Tp:163;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -13897,10 +14550,10 @@
 y=this.a
 if(!J.xC(z,y.mQ))return D.hi(y.Jz,a)
 y.eC(a)
-return y},"$1",null,2,0,null,141,"call"],
+return y},"$1",null,2,0,null,162,"call"],
 $isEH:true},
 jI:{
-"^":"Xs:47;b",
+"^":"Tp:64;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 fz:{
@@ -13912,6 +14565,7 @@
 gi2:function(){var z=this.z7
 return z.gUQ(z)},
 gPj:function(a){return H.d(this.r0)},
+Mq:function(a){return H.d(a)},
 gYe:function(){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
@@ -13926,8 +14580,8 @@
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
 return C.xB.yn(x,w+y)},
-jz:function(a){var z,y,x
-z=$.OX().R4(0,a)
+Gn:function(a){var z,y,x
+z=$.Dw().R4(0,a)
 if(z==null)return""
 y=z.QK
 x=y.index
@@ -13936,31 +14590,31 @@
 if(typeof y!=="number")return H.s(y)
 return J.Nj(a,0,x+y)},
 Qn:function(a){throw H.b(P.SY(null))},
-dJ:function(a){var z
+Tn:function(a){var z
 if(a==="")return P.PG(null,null)
 z=this.z7.t(0,a)
 if(z!=null)return P.PG(z,null)
 return this.VD(0).ml(new D.MZ(this,a))},
-ox:function(a){var z,y,x,w,v
+cv:function(a){var z,y,x,w,v
 z={}
 z.a=a
 y=J.uH(a,"#")
 if(0>=y.length)return H.e(y,0)
 a=y[0]
 z.a=a
-if(J.co(a,"isolates/")){x=this.jz(z.a)
+if(J.co(a,"isolates/")){x=this.Gn(z.a)
 w=this.hV(z.a)
-return this.dJ(x).ml(new D.kk(this,w))}v=this.Qy.t(0,z.a)
+return this.Tn(x).ml(new D.lb(this,w))}v=this.Qy.t(0,z.a)
 if(v!=null)return J.LE(v)
-return this.HL(z.a).ml(new D.lb(z,this))},
-nJ:[function(a,b){return b},"$2","ge1",4,0,50],
+return this.HL(z.a).ml(new D.aEE(z,this))},
+nJ:[function(a,b){return b},"$2","ge1",4,0,67],
 ng:function(a){var z,y,x
 z=null
 try{y=new P.Cf(this.ge1())
 z=P.jc(a,y.gqa())}catch(x){H.Ru(x)
 return}return R.tB(z)},
 N7:function(a){var z
-if(!D.bF(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
 return P.Vu(D.hi(this,R.tB(z)),null,null)}z=J.U6(a)
 if(J.xC(z.t(a,"type"),"ServiceError"))return P.Vu(D.hi(this,a),null,null)
 else if(J.xC(z.t(a,"type"),"ServiceException"))return P.Vu(D.hi(this,a),null,null)
@@ -13968,7 +14622,7 @@
 HL:function(a){return this.z6(0,a).ml(new D.zA(this)).co(new D.tm(this),new D.mR()).co(new D.bp(this),new D.hc())},
 bF:function(a,b,c){var z,y
 if(c)return
-this.kT=!0
+this.Sa=!0
 z=J.U6(b)
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
@@ -13990,9 +14644,9 @@
 if(u!=null)y.u(0,v,u)
 else{u=D.hi(this,w)
 y.u(0,v,u)
-N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.Yu())
+N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.Hq())
 this.z7=y},
-Lw:function(){this.NM=this.ct(this,C.YS,this.NM,"vm")
+md:function(){this.px=this.ct(this,C.YS,this.px,"vm")
 this.t7=this.ct(this,C.Tc,this.t7,"vm")
 this.Qy.u(0,"vm",this)
 var z=P.EF(["id","vm","type","@VM"],null,null)
@@ -14002,87 +14656,87 @@
 "^":"fz+Pi;",
 $isd3:true},
 MZ:{
-"^":"Xs:30;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,93,"call"],
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,109,"call"],
 $isEH:true},
-kk:{
-"^":"Xs:30;b,c",
+lb:{
+"^":"Tp:10;b,c",
 $1:[function(a){var z
 if(a==null)return this.b
 z=this.c
 if(z==null)return J.LE(a)
-else return a.ox(z)},"$1",null,2,0,null,4,"call"],
+else return a.cv(z)},"$1",null,2,0,null,4,"call"],
 $isEH:true},
-lb:{
-"^":"Xs:142;a,d",
+aEE:{
+"^":"Tp:163;a,d",
 $1:[function(a){var z,y
 z=this.d
 y=D.hi(z,a)
-if(y.gUm())z.Qy.to(this.a.a,new D.QZ(y))
-return y},"$1",null,2,0,null,141,"call"],
+if(y.gUm())z.Qy.to(this.a.a,new D.zK(y))
+return y},"$1",null,2,0,null,162,"call"],
 $isEH:true},
-QZ:{
-"^":"Xs:47;e",
+zK:{
+"^":"Tp:64;e",
 $0:function(){return this.e},
 $isEH:true},
 zA:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w
 z=null
 try{z=this.a.ng(a)}catch(x){w=H.Ru(x)
 y=w
-P.mp("Hit V8 bug.")
+P.FL("Hit V8 bug.")
 w=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
 w=R.tB(w)
-return P.Vu(D.hi(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,96,"call"],
+return P.Vu(D.hi(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,112,"call"],
 $isEH:true},
 tm:{
-"^":"Xs:30;b",
+"^":"Tp:10;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,19,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,21,"call"],
 $isEH:true},
 mR:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 bp:{
-"^":"Xs:30;c",
+"^":"Tp:10;c",
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,58,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,75,"call"],
 $isEH:true},
 hc:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-Yu:{
-"^":"Xs:50;",
+Hq:{
+"^":"Tp:67;",
 $2:function(a,b){J.LE(b)},
 $isEH:true},
 ER:{
-"^":"a;SP,KE>,wZ",
-eK:function(a){var z,y,x,w,v
-z=this.KE
-H.xr(z,0,a)
+"^":"a;SP,XE>,wZ",
+T1:function(a){var z,y,x,w,v
+z=this.XE
+H.aB(z,0,a)
 for(y=z.length,x=0;x<y;++x){w=this.wZ
 v=z[x]
 if(typeof v!=="number")return H.s(v)
 this.wZ=w+v}},
 y8:function(a,b){var z,y,x,w,v,u,t
-for(z=this.KE,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
+for(z=this.XE,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
 if(v>=w)return H.e(b,v)
-u=J.xH(u,b[v])
+u=J.Hn(u,b[v])
 z[v]=u
 t=this.wZ
 if(typeof u!=="number")return H.s(u)
 this.wZ=t+u}},
 Vy:function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
-y=this.KE
+y=this.XE
 x=y.length
 w=0
 while(!0){v=z.gB(b)
@@ -14090,12 +14744,12 @@
 if(!(w<v))break
 u=z.t(b,w)
 if(w>=x)return H.e(y,w)
-y[w]=J.xZ(y[w],u)?y[w]:u;++w}},
+y[w]=J.z8(y[w],u)?y[w]:u;++w}},
 CJ:function(){var z,y,x
-for(z=this.KE,y=z.length,x=0;x<y;++x)z[x]=0},
+for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;af<,lI<,h7,yP,hD,RP",
+"^":"a;af<,Fw<,h7,yP,hD,RP",
 gij:function(){return this.h7},
 xZ:function(a,b){var z,y,x,w,v,u
 this.h7=a
@@ -14104,7 +14758,7 @@
 x=this.af
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
 this.RP=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
+for(z=this.hD,x=this.Fw,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
 v.$builtinTypeInfo=[P.KN]
@@ -14115,23 +14769,23 @@
 z.fixed$length=init
 z=new D.ER(0,H.VM(z,[P.KN]),0)
 this.yP=z
-z.eK(y)
+z.T1(y)
 return}z=this.RP
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
 z.fixed$length=init
 u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.y8(y,this.yP.KE)
+u.y8(y,this.yP.XE)
 this.yP.Vy(0,y)
-z=this.lI
+z=this.Fw
 z.push(u)
 if(z.length>this.hD)C.Nm.W4(z,0)}},
 bv:{
-"^":"uz4;V3,Jr,EY,eU,zG,XV,Qy,GH,v9,DC,zb,NM:KT@,t7:PB@,Er,cL,Dr,lP,W1,p2,Hw,vJ,yv,BC<,FF,bj,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+"^":"uz4;V3,Jr,EY,eU,zG,XV,Qy,GH,v9,tW,zb,px:KT@,t7:PB@,Er,cL,Dr,lP,W1,p2,Hw,vJ,mk,BC<,FF,bj,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gwv:function(a){return this.Jz},
 god:function(a){return this},
-gKE:function(a){return this.V3},
-sKE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
+gXE:function(a){return this.V3},
+sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
 gPj:function(a){return this.r0},
 gHP:function(){return"#/"+H.d(this.r0)},
 gBP:function(a){return this.Jr},
@@ -14139,7 +14793,8 @@
 gaj:function(){return this.eU},
 gn0:function(){return this.zG},
 gwg:function(){return this.XV},
-xQ:[function(a){return"#/"+(H.d(this.r0)+"/"+H.d(a))},"$1","gw6",2,0,143,144],
+Mq:function(a){return H.d(this.r0)+"/"+H.d(a)},
+xQ:[function(a){return"#/"+(H.d(this.r0)+"/"+H.d(a))},"$1","gw6",2,0,164,165],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -14147,17 +14802,17 @@
 this.c2()
 this.hr(a,z)
 w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.aU(w,z)},
+if(w!=null)this.BC=this.uY(w,z)},
 c2:function(){var z=this.Qy
-z.gUQ(z).aN(0,new D.Xa())},
+z.gUQ(z).aN(0,new D.Mn())},
 hr: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.mY(y);z.G();){w=z.gl()
 J.UQ(w,"code").eL(w,b,x)}},
-lh:[function(a){return this.ox("coverage").ml(this.gJJ())},"$0","gWp",0,0,145],
-na:[function(a){J.kH(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,146,147],
+lh:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gWp",0,0,166],
+cNN:[function(a){J.kH(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,167,168],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -14167,12 +14822,12 @@
 x=D.hi(this,a)
 if(x.gUm())y.u(0,z,x)
 return x},
-ox:function(a){var z=this.Qy.t(0,a)
+cv:function(a){var z=this.Qy.t(0,a)
 if(z!=null)return J.LE(z)
 return this.Jz.HL(H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
 gVc:function(){return this.v9},
 sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
-gvU:function(){return this.DC},
+gvU:function(){return this.tW},
 gkw:function(){return this.zb},
 goc:function(a){return this.KT},
 soc:function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},
@@ -14185,8 +14840,8 @@
 guq:function(){return this.W1},
 gxs:function(){return this.p2},
 gQB:function(){return this.Hw},
-gkc:function(a){return this.yv},
-skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
+gkc:function(a){return this.mk},
+skc:function(a,b){this.mk=F.Wi(this,C.yh,this.mk,b)},
 bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z=J.U6(b)
 y=z.t(b,"mainPort")
@@ -14196,7 +14851,7 @@
 y=z.t(b,"name")
 this.PB=F.Wi(this,C.Tc,this.PB,y)
 if(c)return
-this.kT=!0
+this.Sa=!0
 this.zG=F.Wi(this,C.DY,this.zG,!1)
 D.tg(b,this)
 if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
@@ -14237,7 +14892,7 @@
 s.u(y,"total",q.t(0,"time_total_runtime"))
 s.u(y,"compile",q.t(0,"time_compilation"))
 s.u(y,"gc",0)
-s.u(y,"init",J.WB(J.WB(J.WB(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
+s.u(y,"init",J.ew(J.ew(J.ew(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
 s.u(y,"dart",q.t(0,"time_dart_execution"))
 y=J.UQ(z.t(b,"heap"),"usedNew")
 this.lP=F.Wi(this,C.EK,this.lP,y)
@@ -14251,7 +14906,7 @@
 if(p!=null)for(y=J.mY(p);y.G();)if(J.xC(y.gl(),"io")){s=this.XV
 if(this.gnz(this)&&!J.xC(s,!0)){s=new T.qI(this,C.h7,s,!0)
 s.$builtinTypeInfo=[null]
-this.SZ(this,s)}this.XV=!0}y=z.t(b,"pauseEvent")
+this.nq(this,s)}this.XV=!0}y=z.t(b,"pauseEvent")
 y=F.Wi(this,C.yG,this.Jr,y)
 this.Jr=y
 y=y==null&&z.t(b,"topFrame")!=null
@@ -14259,18 +14914,18 @@
 y=this.Jr==null&&z.t(b,"topFrame")==null
 this.eU=F.Wi(this,C.q2,this.eU,y)
 y=z.t(b,"error")
-this.yv=F.Wi(this,C.yh,this.yv,y)
-y=this.DC
+this.mk=F.Wi(this,C.yh,this.mk,y)
+y=this.tW
 y.V1(y)
 for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
 y.XP(y,new D.hU())},
 m7:function(){return this.Jz.HL(H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
-aU:function(a,b){this.FF=0
+uY:function(a,b){this.FF=0
 this.bj=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.tw(b)},
-tw:function(a){var z,y,x,w,v,u,t,s,r,q
+return this.AW(b)},
+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()
@@ -14284,8 +14939,8 @@
 this.FF=z+1
 v=J.UQ(y,z)
 z=[]
-z.$builtinTypeInfo=[D.D5]
-u=new D.D5(w,v,z,0)
+z.$builtinTypeInfo=[D.t9]
+u=new D.t9(w,v,z,0)
 y=this.bj
 t=this.FF
 if(typeof t!=="number")return t.g()
@@ -14293,76 +14948,76 @@
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.tw(a)
+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},
 $isbv:true,
-static:{"^":"Sp"}},
+static:{"^":"ZW"}},
 uz4:{
 "^":"fz+Pi;",
 $isd3:true},
-Xa:{
-"^":"Xs:30;",
+Mn:{
+"^":"Tp:10;",
 $1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
 a.Du=0
 a.fF=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.qH=F.Wi(a,C.uU,a.qH,"")
 C.Nm.sB(a.VS,0)
-C.Nm.sB(a.ci,0)
+C.Nm.sB(a.hw,0)
 a.Oo.V1(0)}},
 $isEH:true},
 Yb:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,148,"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,169,"call"],
 $isEH:true},
 KQ:{
-"^":"Xs:142;a,b",
+"^":"Tp:163;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.hi(z,a)
-if(y.gUm())z.Qy.to(this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,141,"call"],
+if(y.gUm())z.Qy.to(this.b,new D.Ng(y))
+return y},"$1",null,2,0,null,162,"call"],
 $isEH:true},
-Ea:{
-"^":"Xs:47;c",
+Ng:{
+"^":"Tp:64;c",
 $0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,149,"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,170,"call"],
 $isEH:true},
 hU:{
-"^":"Xs:50;",
-$2:function(a,b){return J.oE(J.tE(a),J.tE(b))},
+"^":"Tp:67;",
+$2:function(a,b){return J.oE(J.O6(a),J.O6(b))},
 $isEH:true},
 AP:{
-"^":"Xs:142;a",
+"^":"Tp:163;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.GH
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,110,"call"],
+return y},"$1",null,2,0,null,126,"call"],
 $isEH:true},
 vO:{
-"^":"af;Ce,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+"^":"af;Ce,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gUm:function(){return(J.xC(this.mQ,"Class")||J.xC(this.mQ,"Function")||J.xC(this.mQ,"Field"))&&!J.co(this.r0,$.RQ)},
 gfS:function(){return!1},
 bu:function(a){return P.vW(this.Ce)},
 bF:function(a,b,c){var z,y,x
-this.kT=!c
+this.Sa=!c
 z=this.Ce
 z.V1(0)
 z.FV(0,b)
 y=z.Zp
 x=y.t(0,"user_name")
-this.NM=this.ct(0,C.YS,this.NM,x)
+this.px=this.ct(0,C.YS,this.px,x)
 y=y.t(0,"name")
 this.t7=this.ct(0,C.Tc,this.t7,y)
 D.tg(z,this.Jz)},
@@ -14381,14 +15036,14 @@
 return z.gUQ(z)},
 gB:function(a){var z=this.Ce.Zp
 return z.gB(z)},
-BN:[function(a){var z=this.Ce
-return z.BN(z)},"$0","gDx",0,0,76],
-SZ:function(a,b){var z=this.Ce
-return z.SZ(z,b)},
+HC:[function(a){var z=this.Ce
+return z.HC(z)},"$0","gDx",0,0,94],
+nq:function(a,b){var z=this.Ce
+return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.Ce,b,c,d)},
-k0:[function(a){return},"$0","gcm",0,0,13],
+k0:[function(a){return},"$0","gcm",0,0,15],
 NB:[function(a){this.Ce.AP=null
-return},"$0","gym",0,0,13],
+return},"$0","gym",0,0,15],
 gqh:function(a){var z=this.Ce
 return z.gqh(z)},
 gnz:function(a){var z,y
@@ -14404,75 +15059,75 @@
 $isd3:true,
 static:{"^":"RQ"}},
 ft:{
-"^":"D3;J6,LD,jo,ZG,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
-gfY:function(a){return this.J6},
-sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+"^":"D3;I0,LD,jo,ZG,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
 bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"message")
 this.LD=F.Wi(this,C.pX,this.LD,y)
 y=this.Jz
 x=D.hi(y,z.t(b,"exception"))
 this.jo=F.Wi(this,C.ne,this.jo,x)
 z=D.hi(y,z.t(b,"stacktrace"))
-this.ZG=F.Wi(this,C.R3,this.ZG,z)
-z="DartError "+H.d(this.J6)
-z=this.ct(this,C.YS,this.NM,z)
-this.NM=z
+this.ZG=F.Wi(this,C.Pf,this.ZG,z)
+z="DartError "+H.d(this.I0)
+z=this.ct(this,C.YS,this.px,z)
+this.px=z
 this.t7=this.ct(this,C.Tc,this.t7,z)}},
 D3:{
 "^":"af+Pi;",
 $isd3:true},
 N7:{
-"^":"wVq;J6,LD,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
-gfY:function(a){return this.J6},
-sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+"^":"wVq;I0,LD,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
 bF:function(a,b,c){var z,y
-this.kT=!0
+this.Sa=!0
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.I0=F.Wi(this,C.Lc,this.I0,y)
 z=z.t(b,"message")
 this.LD=F.Wi(this,C.pX,this.LD,z)
-z="ServiceError "+H.d(this.J6)
-z=this.ct(this,C.YS,this.NM,z)
-this.NM=z
+z="ServiceError "+H.d(this.I0)
+z=this.ct(this,C.YS,this.px,z)
+this.px=z
 this.t7=this.ct(this,C.Tc,this.t7,z)},
 $isN7:true},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 EP:{
-"^":"dZL;J6,LD,IV,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
-gfY:function(a){return this.J6},
-sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+"^":"dZL;I0,LD,IV,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
 gbA:function(a){return this.IV},
 sbA:function(a,b){this.IV=F.Wi(this,C.F3,this.IV,b)},
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"message")
 this.LD=F.Wi(this,C.pX,this.LD,y)
 z=z.t(b,"response")
 this.IV=F.Wi(this,C.F3,this.IV,z)
-z="ServiceException "+H.d(this.J6)
-z=this.ct(this,C.YS,this.NM,z)
-this.NM=z
+z="ServiceException "+H.d(this.I0)
+z=this.ct(this,C.YS,this.px,z)
+this.px=z
 this.t7=this.ct(this,C.Tc,this.t7,z)},
 $isEP:true},
 dZL:{
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":"w8F;dj,Bm<,hp<,DD>,Z3<,mu<,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+"^":"w8F;dj,Bm<,XR<,DD>,Z3<,mu<,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gO3:function(a){return this.dj},
 gUm:function(){return!0},
 gfS:function(){return!1},
@@ -14486,19 +15141,19 @@
 v=w.cn(y,"/")
 if(typeof v!=="number")return v.g()
 x=w.yn(y,v+1)}y=z.t(b,"user_name")
-y=this.ct(this,C.YS,this.NM,y)
-this.NM=y
-if(J.FN(y)===!0)this.NM=this.ct(this,C.YS,this.NM,x)
+y=this.ct(this,C.YS,this.px,y)
+this.px=y
+if(J.tx(y)===!0)this.px=this.ct(this,C.YS,this.px,x)
 y=z.t(b,"name")
 this.t7=this.ct(this,C.Tc,this.t7,y)
 if(c)return
-this.kT=!0
+this.Sa=!0
 y=this.Jz
 D.tg(b,y.god(y))
 y=this.Bm
 y.V1(y)
 y.FV(0,z.t(b,"imports"))
-y=this.hp
+y=this.XR
 y.V1(y)
 y.FV(0,z.t(b,"scripts"))
 y=this.DD
@@ -14518,31 +15173,31 @@
 "^":"a;Rd<,a4>",
 $isc2:true},
 vx:{
-"^":"V4b;Gd>,u9<,J6,U9,lx,mB,A1,y6,FB,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
-gfY:function(a){return this.J6},
-sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
-ghY:function(){return this.U9},
-shY:function(a){var z=this.U9
+"^":"V4b;Gd>,u9<,I0,l9,lx,mB,A1,y6,FB,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
+ghY:function(){return this.l9},
+shY:function(a){var z=this.l9
 if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.Gd,z,a)
 z.$builtinTypeInfo=[null]
-this.SZ(this,z)}this.U9=a},
+this.nq(this,z)}this.l9=a},
 gSK:function(){return this.lx},
 sSK:function(a){var z=this.lx
 if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.kA,z,a)
 z.$builtinTypeInfo=[null]
-this.SZ(this,z)}this.lx=a},
+this.nq(this,z)}this.lx=a},
 gUm:function(){return!0},
 gfS:function(){return!0},
 rK:function(a){var z,y
-z=J.xH(a,1)
-y=this.Gd.Jo
+z=J.Hn(a,1)
+y=this.Gd.ao
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
 q6:function(a){return this.y6.t(0,a)},
 bF:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"name")
 this.A1=y
 x=J.U6(y)
@@ -14550,16 +15205,16 @@
 if(typeof w!=="number")return w.g()
 w=x.yn(y,w+1)
 this.mB=w
-this.NM=this.ct(this,C.YS,this.NM,w)
+this.px=this.ct(this,C.YS,this.px,w)
 w=this.A1
 this.t7=this.ct(this,C.Tc,this.t7,w)
-this.W8(z.t(b,"source"))
+this.ip(z.t(b,"source"))
 this.PT(z.t(b,"tokenPosTable"))},
 PT:function(a){var z,y,x,w,v,u,t,s,r
 if(a==null)return
 this.y6=P.Fl(null,null)
 this.FB=P.Fl(null,null)
-this.U9=F.Wi(this,C.Gd,this.U9,null)
+this.l9=F.Wi(this,C.Gd,this.l9,null)
 this.lx=F.Wi(this,C.kA,this.lx,null)
 for(z=J.mY(a);z.G();){y=z.gl()
 x=J.U6(y)
@@ -14570,23 +15225,23 @@
 if(!(v<u))break
 t=x.t(y,v)
 s=x.t(y,v+1)
-u=this.U9
+u=this.l9
 if(u==null){if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.Gd,u,t)
 u.$builtinTypeInfo=[null]
-this.SZ(this,u)}this.U9=t
+this.nq(this,u)}this.l9=t
 u=this.lx
 if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.kA,u,t)
 u.$builtinTypeInfo=[null]
-this.SZ(this,u)}this.lx=t}else{u=J.Bl(u,t)?this.U9:t
-r=this.U9
+this.nq(this,u)}this.lx=t}else{u=J.Bl(u,t)?this.l9:t
+r=this.l9
 if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.Gd,r,u)
 r.$builtinTypeInfo=[null]
-this.SZ(this,r)}this.U9=u
+this.nq(this,r)}this.l9=u
 u=J.J5(this.lx,t)?this.lx:t
 r=this.lx
 if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.kA,r,u)
 r.$builtinTypeInfo=[null]
-this.SZ(this,r)}this.lx=u}this.y6.u(0,t,w)
+this.nq(this,r)}this.lx=u}this.y6.u(0,t,w)
 this.FB.u(0,t,s)
 v+=2}}},
 vW:function(a){var z,y,x,w
@@ -14598,12 +15253,12 @@
 if(!(x<w))break
 y.u(0,z.t(a,x),z.t(a,x+1))
 x+=2}},
-W8:function(a){var z,y,x,w
-this.kT=!1
+ip:function(a){var z,y,x,w
+this.Sa=!1
 if(a==null)return
 z=J.uH(a,"\n")
 if(z.length===0)return
-this.kT=!0
+this.Sa=!0
 y=this.Gd
 y.V1(y)
 N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.A1))
@@ -14617,15 +15272,15 @@
 "^":"a;Yu<,Du<,fF<",
 $isuA:true},
 HJ:{
-"^":"Pi;Yu<,Ix,VF<,Yn,fY>,ar,MT,AP,fn",
-gtu:function(a){return this.ar},
-stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+"^":"Pi;Yu<,Ix,VF<,YnP,fY>,ar,MT,AP,fn",
+gIs:function(a){return this.ar},
+sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
 gP3:function(){return this.MT},
 Nw:[function(){var z,y
 z=this.Ix
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,150],
+return y.bu(z)},"$0","gkA",0,0,171],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -14640,23 +15295,23 @@
 "^":"Pi;Yu<,Fm,L4<,dh,uH<,AP,fn",
 gEB:function(){return this.dh},
 gUB:function(){return J.xC(this.Yu,0)},
-gGf:function(){return this.uH.Jo.length>0},
+gGf:function(){return this.uH.ao.length>0},
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,150],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,171],
 io:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
 if(J.xC(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,151,49],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,172,66],
 HU:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,151,49],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,172,66],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -14672,22 +15327,22 @@
 if(!J.co(z,"j"))return
 y=this.eQ()
 x=J.x(y)
-if(x.n(y,0)){P.mp("Could not determine jump address for "+H.d(z))
-return}for(z=a.Jo,w=0;w<z.length;++w){v=z[w]
+if(x.n(y,0)){P.FL("Could not determine jump address for "+H.d(z))
+return}for(z=a.ao,w=0;w<z.length;++w){v=z[w]
 if(J.xC(v.gYu(),y)){z=this.dh
 if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
-this.SZ(this,z)}this.dh=v
-return}}P.mp("Could not find instruction at "+x.WZ(y,16))},
+this.nq(this,z)}this.dh=v
+return}}P.FL("Could not find instruction at "+x.WZ(y,16))},
 $isDP:true,
 static:{Tn:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
 bu:function(a){return this.uX},
-static:{"^":"Oci,pg,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,AA,Z7U",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
-else if(z.n(a,"Collected"))return C.WA
+else if(z.n(a,"Collected"))return C.wV
 else if(z.n(a,"Reused"))return C.yP
 else if(z.n(a,"Tag"))return C.Z7
 N.QM("").j2("Unknown code kind "+H.d(a))
@@ -14695,13 +15350,13 @@
 ta:{
 "^":"a;tT>,Av<",
 $ista:true},
-D5:{
+t9:{
 "^":"a;tT>,Av<,ks>,Jv",
-$isD5:true},
+$ist9:true},
 kx:{
-"^":"Zqa;J6,xM,Du<,fF<,Oj,Mb,VS,ci,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
-gfY:function(a){return this.J6},
-sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+"^":"Zqa;I0,xM,Du<,fF<,Oj,Mb,VS,hw,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 glt:function(){return this.xM},
 gS7:function(){return this.mM},
 gan:function(){return this.qH},
@@ -14709,21 +15364,21 @@
 sL1:function(a){this.Ni=F.Wi(this,C.zO,this.Ni,a)},
 gig:function(a){return this.MO},
 sig:function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},
-gtu:function(a){return this.ar},
-stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gIs:function(a){return this.ar},
+sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
 gYG:function(){return this.MH},
 gUm:function(){return!0},
 gfS:function(){return!0},
 tx:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","guL",2,0,152,153],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","guL",2,0,173,174],
 OF:function(){if(this.ar!=null)return
-if(!J.xC(this.J6,C.l8))return
+if(!J.xC(this.I0,C.l8))return
 var z=this.MO
 if(z==null)return
 if(J.UQ(z,"script")==null){J.SK(this.MO).ml(new D.Em(this))
 return}J.SK(J.UQ(this.MO,"script")).ml(this.guL())},
-VD:function(a){if(J.xC(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
+VD:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.VD.call(this,this)
 return P.PG(this,null)},
 bd:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
@@ -14735,14 +15390,14 @@
 v=H.BU(z.t(b,y+1),null,null)
 if(w>>>0!==w||w>=c.length)return H.e(c,w)
 a.push(new D.ta(c[w],v))
-y+=2}H.ZE(a,0,a.length-1,new D.jm())},
+y+=2}H.rd(a,new D.fx())},
 eL:function(a,b,c){var z,y
 this.xM=F.Wi(this,C.Kj,this.xM,c)
 z=J.U6(a)
 this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
 this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
 this.bd(this.VS,z.t(a,"callers"),b)
-this.bd(this.ci,z.t(a,"callees"),b)
+this.bd(this.hw,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
 if(y!=null)this.qL(y)
 z=D.Rd(this.fF,this.xM)+" ("+H.d(this.fF)+")"
@@ -14756,7 +15411,7 @@
 y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
 this.MH=F.Wi(this,C.pY,this.MH,y)
 y=D.CQ(z.t(b,"kind"))
-this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.I0=F.Wi(this,C.Lc,this.I0,y)
 this.Oj=H.BU(z.t(b,"start"),16,null)
 this.Mb=H.BU(z.t(b,"end"),16,null)
 y=this.Jz
@@ -14765,15 +15420,15 @@
 y=y.god(y).Qn(z.t(b,"object_pool"))
 this.Ni=F.Wi(this,C.zO,this.Ni,y)
 w=z.t(b,"disassembly")
-if(w!=null)this.zl(w)
+if(w!=null)this.zk(w)
 v=z.t(b,"descriptors")
 if(v!=null)this.WY(J.UQ(v,"members"))
-z=this.va.Jo
-this.kT=z.length!==0||!J.xC(this.J6,C.l8)
-z=z.length!==0&&J.xC(this.J6,C.l8)
+z=this.va.ao
+this.Sa=z.length!==0||!J.xC(this.I0,C.l8)
+z=z.length!==0&&J.xC(this.I0,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
 gUa:function(){return this.TD},
-zl:function(a){var z,y,x,w,v,u,t,s
+zk:function(a){var z,y,x,w,v,u,t,s
 z=this.va
 z.V1(z)
 y=J.U6(a)
@@ -14813,42 +15468,104 @@
 v=H.BU(z.t(a,x),16,null)
 y.u(0,v,new D.uA(v,H.BU(z.t(a,x+1),null,null),H.BU(z.t(a,x+2),null,null)))
 x+=3}},
-tg:function(a,b){b.F(0,this.Oj)
+tg:function(a,b){J.J5(b,this.Oj)
 return!1},
-gkU:function(){return J.xC(this.J6,C.l8)},
+gkU:function(){return J.xC(this.I0,C.l8)},
 $iskx:true,
 static:{Rd:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.guL())},"$1",null,2,0,null,154,"call"],
+J.SK(y).ml(z.guL())},"$1",null,2,0,null,175,"call"],
 $isEH:true},
-jm:{
-"^":"Xs:50;",
-$2:function(a,b){return J.xH(b.gAv(),a.gAv())},
+fx:{
+"^":"Tp:67;",
+$2:function(a,b){return J.Hn(b.gAv(),a.gAv())},
 $isEH:true},
-UZ:{
-"^":"Xs:50;a,b",
+l8R:{
+"^":"a;uX",
+bu:function(a){return this.uX},
+static:{"^":"Zt,lTU,FJy,wjk",Fs:function(a){var z=J.x(a)
+if(z.n(a,"Listening"))return C.Cn
+else if(z.n(a,"Normal"))return C.qp
+else if(z.n(a,"Pipe"))return C.FJ
+else if(z.n(a,"Internal"))return C.wj
+N.QM("").j2("Unknown socket kind "+H.d(a))
+throw H.b(P.a9())}}},
+WP:{
+"^":"D3i;V8@,je,mU,I0,vud,DB,XK,vO,L7,zw,tO,HO,kJ,EC,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gUm:function(){return!0},
+gHY:function(){return J.xC(this.I0,C.FJ)},
+gfY:function(a){return this.I0},
+sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
+gyv:function(a){return this.vud},
+gm8:function(){return this.DB},
+gaU:function(){return this.XK},
+gaP:function(){return this.vO},
+gzM:function(){return this.L7},
+gkE:function(){return this.zw},
+giP:function(){return this.tO},
+gLw:function(){return this.HO},
+gNS:function(){return this.kJ},
+guh:function(){return this.EC},
+bF:function(a,b,c){var z,y
+z=J.U6(b)
+y=z.t(b,"name")
+this.px=this.ct(this,C.YS,this.px,y)
+y=z.t(b,"name")
+this.t7=this.ct(this,C.Tc,this.t7,y)
+y=D.Fs(z.t(b,"kind"))
+this.I0=F.Wi(this,C.Lc,this.I0,y)
+if(c)return
+this.Sa=!0
+y=this.Jz
+D.tg(b,y.god(y))
+y=z.t(b,"readClosed")
+this.DB=F.Wi(this,C.I7,this.DB,y)
+y=z.t(b,"writeClosed")
+this.XK=F.Wi(this,C.Uy,this.XK,y)
+y=z.t(b,"closing")
+this.vO=F.Wi(this,C.To,this.vO,y)
+y=z.t(b,"listening")
+this.L7=F.Wi(this,C.cc,this.L7,y)
+y=z.t(b,"protocol")
+this.vud=F.Wi(this,C.AY,this.vud,y)
+y=z.t(b,"localAddress")
+this.tO=F.Wi(this,C.Lx,this.tO,y)
+y=z.t(b,"localPort")
+this.HO=F.Wi(this,C.M3,this.HO,y)
+y=z.t(b,"remoteAddress")
+this.kJ=F.Wi(this,C.yL,this.kJ,y)
+y=z.t(b,"remotePort")
+this.EC=F.Wi(this,C.ni,this.EC,y)
+y=z.t(b,"fd")
+this.zw=F.Wi(this,C.R3,this.zw,y)
+this.V8=z.t(b,"owner")}},
+D3i:{
+"^":"af+Pi;",
+$isd3:true},
+Qf:{
+"^":"Tp:67;a,b",
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
-if(y&&D.bF(b))this.a.u(0,a,this.b.Qn(b))
+if(y&&D.D5(b))this.a.u(0,a,this.b.Qn(b))
 else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},
+else if(y)D.yX(b,this.b)},
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
 zM:{
-"^":"V32;xT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V42;xT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gkc:function(a){return a.xT},
 skc:function(a,b){a.xT=this.ct(a,C.yh,a.xT,b)},
 static:{cE:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -14859,16 +15576,16 @@
 C.SX.ZL(a)
 C.SX.XI(a)
 return a}}},
-V32:{
+V42:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 Rk:{
-"^":"V33;Xc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V43;Xc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gja:function(a){return a.Xc},
 sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
-static:{bZp:function(a){var z,y,x,w
-z=$.Nd()
+static:{dP:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -14879,28 +15596,28 @@
 C.ZJ.ZL(a)
 C.ZJ.XI(a)
 return a}}},
-V33:{
+V43:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
-Fk:{
-"^":"wv;Jf,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+XK:{
+"^":"wv;Jf,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 z6:function(a,b){var z
 N.QM("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
 if(typeof z!=="string")return z.g()
-return W.It(J.WB(z,b),null,null).OA(new U.dT())},
+return W.It(J.ew(z,b),null,null).OA(new U.dT())},
 SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
 dT:{
-"^":"Xs:30;",
+"^":"Tp:10;",
 $1:[function(a){var z
 N.QM("").YX("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.zc.KP(P.EF(["type","ServiceException","id","","response",J.lN(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,19,"call"],
+return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.Du(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,21,"call"],
 $isEH:true},
 bl:{
-"^":"wv;ba,yb,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+"^":"wv;ba,yb,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 q3:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -14910,7 +15627,7 @@
 z=this.ba
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,15,155],
+J.KD(v,w)},"$1","gVx",2,0,17,176],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -14919,14 +15636,14 @@
 y.u(0,"query","/"+H.d(b));++this.yb
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.ba.u(0,z,x)
-J.vI(W.Pv(window.parent),C.zc.KP(y),"*")
+J.vI(W.Pv(window.parent),C.xr.KP(y),"*")
 return x.MM},
 PI:function(){var z=H.VM(new W.RO(window,C.ph.Ph,!1),[null])
 H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
 N.QM("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 Ti:{
-"^":"V34;Ll,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V44;Ll,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
 Xq:function(a){var z
@@ -14948,8 +15665,11 @@
 case"Field":z=W.r3("field-view",null)
 J.JZ(z,a.Ll)
 return z
+case"FlagList":z=W.r3("flag-list",null)
+J.GF(z,a.Ll)
+return z
 case"Function":z=W.r3("function-view",null)
-J.Pq(z,a.Ll)
+J.C3(z,a.Ll)
 return z
 case"HeapMap":z=W.r3("heap-map",null)
 J.Nf(z,a.Ll)
@@ -14958,7 +15678,7 @@
 J.Qy(z,a.Ll)
 return z
 case"IO":z=W.r3("io-view",null)
-J.vU(z,a.Ll)
+J.mU(z,a.Ll)
 return z
 case"HttpServerList":z=W.r3("io-http-server-list-view",null)
 J.A4(z,a.Ll)
@@ -14966,15 +15686,39 @@
 case"HttpServer":z=W.r3("io-http-server-view",null)
 J.fb(z,a.Ll)
 return z
+case"SocketList":z=W.r3("io-socket-list-view",null)
+J.A4(z,a.Ll)
+return z
+case"Socket":z=W.r3("io-socket-view",null)
+J.Cu(z,a.Ll)
+return z
+case"WebSocketList":z=W.r3("io-web-socket-list-view",null)
+J.A4(z,a.Ll)
+return z
+case"WebSocket":z=W.r3("io-web-socket-view",null)
+J.tH(z,a.Ll)
+return z
 case"Isolate":z=W.r3("isolate-view",null)
 J.uM(z,a.Ll)
 return z
 case"Library":z=W.r3("library-view",null)
 J.cl(z,a.Ll)
 return z
+case"ProcessList":z=W.r3("io-process-list-view",null)
+J.A4(z,a.Ll)
+return z
+case"Process":z=W.r3("io-process-view",null)
+J.aw(z,a.Ll)
+return z
 case"Profile":z=W.r3("isolate-profile",null)
 J.CJ(z,a.Ll)
 return z
+case"RandomAccessFileList":z=W.r3("io-random-access-file-list-view",null)
+J.A4(z,a.Ll)
+return z
+case"RandomAccessFile":z=W.r3("io-random-access-file-view",null)
+J.fR(z,a.Ll)
+return z
 case"ServiceError":z=W.r3("service-error-view",null)
 J.Qr(z,a.Ll)
 return z
@@ -14982,13 +15726,13 @@
 J.BC(z,a.Ll)
 return z
 case"Script":z=W.r3("script-view",null)
-J.ry(z,a.Ll)
+J.ZI(z,a.Ll)
 return z
 case"StackTrace":z=W.r3("stack-trace",null)
 J.yO(z,a.Ll)
 return z
 case"VM":z=W.r3("vm-view",null)
-J.Jn(z,a.Ll)
+J.tQ(z,a.Ll)
 return z
 default:z=W.r3("json-view",null)
 J.wD(z,a.Ll)
@@ -15001,9 +15745,9 @@
 x=this.Xq(a)
 if(x==null){N.QM("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,30,34],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,10,54],
 static:{lv:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -15011,10 +15755,10 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.th.ZL(a)
-C.th.XI(a)
+C.Ns.ZL(a)
+C.Ns.XI(a)
 return a}}},
-V34:{
+V44:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
@@ -15027,7 +15771,7 @@
 Qj:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
 this.ct(a,C.pu,0,1)
-this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,15,34],
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,17,54],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 return z.gHP()},
@@ -15036,10 +15780,10 @@
 return z.gzz()},
 goc:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.tE(z)},
-gWw:function(a){return J.FN(this.goc(a))},
+return J.O6(z)},
+gWw:function(a){return J.tx(this.goc(a))},
 static:{lK:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -15056,17 +15800,17 @@
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
 CY:{
-"^":"Xfs;wG,IK,bP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gd4:function(a){return a.wG},
-sd4:function(a,b){a.wG=this.ct(a,C.bk,a.wG,b)},
+"^":"KAf;kF,IK,bP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gd4:function(a){return a.kF},
+sd4:function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},
 gEu:function(a){return a.IK},
 sEu:function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
-XF:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.wG=this.ct(a,C.bk,a.wG,z)},"$3","gQU",6,0,69,1,156,71],
+RC:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,86,1,177,88],
 static:{Al:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -15077,27 +15821,27 @@
 C.Yo.ZL(a)
 C.Yo.XI(a)
 return a}}},
-Xfs:{
+KAf:{
 "^":"ir+Pi;",
 $isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
 "^":"",
 Wq:{
-"^":"a;c1,BH,Mg,QR,ER,Ja,MR,eA",
-WO:function(a,b){return this.eA.$1(b)},
+"^":"a;wq,BH,Mg,QR,ER,Ja,MR,tu",
+WO:function(a,b){return this.tu.$1(b)},
 bu:function(a){var z=P.p9("")
 z.KF("(options:")
-z.KF(this.c1?"fields ":"")
+z.KF(this.wq?"fields ":"")
 z.KF(this.BH?"properties ":"")
 z.KF(this.Ja?"methods ":"")
 z.KF(this.Mg?"inherited ":"_")
 z.KF(this.ER?"no finals ":"")
 z.KF("annotations: "+H.d(this.MR))
-z.KF(this.eA!=null?"with matcher":"")
+z.KF(this.tu!=null?"with matcher":"")
 z.KF(")")
 return z.vM}},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
-gHO:function(){return this.fY===C.nU},
+gZI:function(){return this.fY===C.nU},
 gUd:function(){return this.fY===C.BM},
 gUA:function(){return this.fY===C.it},
 giO:function(a){var z=this.oc
@@ -15139,7 +15883,7 @@
 if(!!J.x(v).$isuq){u=w.gbx(y)
 u=$.mX().aG(u,v)}else u=!1
 if(u)return!0}}return!1},
-Lx:function(a){var z,y
+OS:function(a){var z,y
 z=H.G3()
 y=H.KT(z).BD(a)
 if(y)return 0
@@ -15150,7 +15894,7 @@
 z=H.KT(z,[z,z,z]).BD(a)
 if(z)return 3
 return 4},
-aW:function(a){var z,y
+Zpg:function(a){var z,y
 z=H.G3()
 y=H.KT(z,[z,z,z]).BD(a)
 if(y)return 3
@@ -15174,88 +15918,88 @@
 kP:function(){throw H.b(P.FM("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["smoke.static","package:smoke/static.dart",,O,{
 "^":"",
 Oj:{
-"^":"a;tO,F8,lk,BJ,fu,af<,yQ"},
+"^":"a;LH,QD,lk,of,fu,af<,yQ"},
 LT:{
-"^":"a;Gu,Gl,N5",
-jD:function(a,b){var z=this.Gu.t(0,b)
+"^":"a;eA,vk,X9",
+jD:function(a,b){var z=this.eA.t(0,b)
 if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(a)},
-Cq:function(a,b,c){var z=this.Gl.t(0,b)
+Cq:function(a,b,c){var z=this.vk.t(0,b)
 if(z==null)throw H.b(O.lA("setter \""+H.d(b)+"\" in "+H.d(a)))
 z.$2(a,c)},
 Ck:function(a,b,c,d,e){var z,y,x,w,v,u,t
 z=null
-if(!!J.x(a).$isuq){this.N5.t(0,a)
-z=null}else{x=this.Gu.t(0,b)
+if(!!J.x(a).$isuq){this.X9.t(0,a)
+z=null}else{x=this.eA.t(0,b)
 z=x==null?null:x.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){w=X.Lx(z)
+if(d){w=X.OS(z)
 if(w>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
-c=X.Na(c,w,P.y(w,J.q8(c)))}else{v=X.aW(z)
+c=X.Na(c,w,P.y(w,J.q8(c)))}else{v=X.Zpg(z)
 u=v>=0?v:J.q8(c)
 c=X.Na(c,w,u)}}try{u=H.im(z,c,P.Te(null))
-return u}catch(t){if(!!J.x(H.Ru(t)).$isMC){if(y!=null)P.mp(y)
+return u}catch(t){if(!!J.x(H.Ru(t)).$isJS){if(y!=null)P.FL(y)
 throw t}else throw t}}},
 bY:{
-"^":"a;Mp,Cu,u4",
+"^":"a;TB,WF,ad",
 aG:function(a,b){var z,y,x
 if(a.n(0,b)||b.n(0,C.FQ))return!0
-for(z=this.Mp;!J.xC(a,C.FQ);a=y){y=z.t(0,a)
+for(z=this.TB;!J.xC(a,C.FQ);a=y){y=z.t(0,a)
 x=J.x(y)
 if(x.n(y,b))return!0
-if(y==null){if(!this.u4)return!1
+if(y==null){if(!this.ad)return!1
 throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
-UK:function(a,b){var z=this.Qk(a,b)
+UK:function(a,b){var z=this.F1(a,b)
 return z!=null&&z.fY===C.it&&!z.Fo},
 n6:function(a,b){var z,y
-z=this.Cu.t(0,a)
-if(z==null){if(!this.u4)return!1
+z=this.WF.t(0,a)
+if(z==null){if(!this.ad)return!1
 throw H.b(O.lA("declarations for "+H.d(a)))}y=z.t(0,b)
 return y!=null&&y.fY===C.it&&y.Fo},
-CV:function(a,b){var z=this.Qk(a,b)
-if(z==null){if(!this.u4)return
+CV:function(a,b){var z=this.F1(a,b)
+if(z==null){if(!this.ad)return
 throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
 Me:function(a,b,c){var z,y,x,w,v,u
 z=[]
-if(c.Mg){y=this.Mp.t(0,b)
-if(y==null){if(this.u4)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.QR))z=this.Me(0,y,c)}x=this.Cu.t(0,b)
-if(x==null){if(!this.u4)return z
+if(c.Mg){y=this.TB.t(0,b)
+if(y==null){if(this.ad)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.QR))z=this.Me(0,y,c)}x=this.WF.t(0,b)
+if(x==null){if(!this.ad)return z
 throw H.b(O.lA("declarations for "+H.d(b)))}for(w=J.mY(x.gUQ(x));w.G();){v=w.gl()
-if(!c.c1&&v.gHO())continue
+if(!c.wq&&v.gZI())continue
 if(!c.BH&&v.gUd())continue
 if(c.ER&&J.ql(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
-if(c.eA!=null&&c.WO(0,J.tE(v))!==!0)continue
+if(c.tu!=null&&c.WO(0,J.O6(v))!==!0)continue
 u=c.MR
 if(u!=null&&!X.ZO(v.gDv(),u))continue
 z.push(v)}return z},
-Qk:function(a,b){var z,y,x,w,v
-for(z=this.Mp,y=this.Cu;!J.xC(a,C.FQ);a=v){x=y.t(0,a)
+F1:function(a,b){var z,y,x,w,v
+for(z=this.TB,y=this.WF;!J.xC(a,C.FQ);a=v){x=y.t(0,a)
 if(x!=null){w=x.t(0,b)
 if(w!=null)return w}v=z.t(0,a)
-if(v==null){if(!this.u4)return
+if(v==null){if(!this.ad)return
 throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
 ut:{
-"^":"a;eB,d8",
-Ut:function(a){this.eB.aN(0,new O.Fi(this))},
+"^":"a;ep,I1",
+Ut:function(a){this.ep.aN(0,new O.Fi(this))},
 static:{ty:function(a){var z=new O.ut(a.af,P.Fl(null,null))
 z.Ut(a)
 return z}}},
 Fi:{
-"^":"Xs:50;a",
-$2:function(a,b){this.a.d8.u(0,b,a)},
+"^":"Tp:67;a",
+$2:function(a,b){this.a.I1.u(0,b,a)},
 $isEH:true},
 tk:{
-"^":"a;uh",
-bu:function(a){return"Missing "+this.uh+". Code generation for the smoke package seems incomplete."},
+"^":"a;GB",
+bu:function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},
 static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":"V35;xP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V45;xP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
-static:{an:function(a){var z,y,x,w
-z=$.Nd()
+static:{qa:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -15266,17 +16010,17 @@
 C.dX.ZL(a)
 C.dX.XI(a)
 return a}}},
-V35:{
+V45:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uw:{
-"^":"V36;ju,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V46;ju,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gtN:function(a){return a.ju},
 stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-RF:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,15,65],
-static:{bV:function(a){var z,y,x,w
-z=$.Nd()
+RF:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,17,82],
+static:{HI:function(a){var z,y,x,w
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -15287,7 +16031,7 @@
 C.wB.ZL(a)
 C.wB.XI(a)
 return a}}},
-V36:{
+V46:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
@@ -15324,7 +16068,7 @@
 a=w}}y=J.x(a)
 if(!!y.$isQF||!!y.$isI0||!!y.$ishy)return a
 return},
-aU:function(a){var z
+Ci:function(a){var z
 for(;z=J.RE(a),z.gBy(a)!=null;)a=z.gBy(a)
 return $.rf().t(0,a)!=null?a:null},
 H4:function(a,b,c){if(c==null)return
@@ -15340,7 +16084,7 @@
 F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
-y=M.wR(a)
+y=M.RI(a)
 new W.E9(a).aN(0,new M.NW(z,a,b,y))
 if(y){x=z.a
 if(x==null){w=[]
@@ -15373,7 +16117,7 @@
 t=z!=null?z.$3(d,c,!1):b.Pn(u).Tl(d)
 if(u>=w)return H.e(v,u)
 v[u]=t;++u}return b.qm(v)},
-LH:function(a,b,c,d){var z,y,x,w,v,u,t,s
+GZ:function(a,b,c,d){var z,y,x,w,v,u,t,s
 if(b.geq())return M.KH(a,b,c,d)
 if(b.gqz()){z=b.HH(0)
 if(z!=null)y=z.$3(d,c,!1)
@@ -15381,10 +16125,10 @@
 x=!!J.x(x).$isTv?x:L.hk(x)
 w=$.ps
 $.ps=w+1
-y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.cc(y,b.gcK(),null,null,null)}x=$.ps
+y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.Qw(y,b.gcK(),null,null,null)}x=$.ps
 $.ps=x+1
 y=new L.NV(null,[],x,null,null,null)
-y.Hy=[]
+y.Wf=[]
 x=J.U6(b)
 v=0
 while(!0){w=x.gB(b)
@@ -15394,19 +16138,19 @@
 z=b.HH(v)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
-else{if(y.xX!=null||y.Bg==null)H.vh(P.w("Cannot add observers once started."))
-J.mu(t,y.gQ8())
-w=y.Bg
+else{if(y.GX!=null||y.TV==null)H.vh(P.w("Cannot add observers once started."))
+J.mu(t,y.gjM())
+w=y.TV
 w.push(C.dV)
 w.push(t)}break c$0}s=b.Pn(v)
 if(u===!0)y.ti(s.Tl(d))
-else y.yN(d,s)}++v}return new Y.cc(y,b.gcK(),null,null,null)},
+else y.yN(d,s)}++v}return new Y.Qw(y,b.gcK(),null,null,null)},
 mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.RE(b)
 y=z.gCd(b)
 for(x=J.U6(y),w=!!J.x(a).$isvy,v=d!=null,u=0;u<x.gB(y);u+=2){t=x.t(y,u)
 s=x.t(y,u+1)
-r=M.LH(t,s,a,c)
+r=M.GZ(t,s,a,c)
 q=w?a:M.Ky(a)
 p=J.FS(q,t,r,s.geq())
 if(p!=null&&v)d.push(p)}if(!z.$isqf)return
@@ -15421,17 +16165,17 @@
 x=y==null?null:H.of(y,z.Qz())
 if(x!=null)return x
 w=J.x(a)
-if(!!w.$isMi)x=new M.ee(a,null,null)
+if(!!w.$isJK)x=new M.ee(a,null,null)
 else if(!!w.$isbs)x=new M.ug(a,null,null)
-else if(!!w.$isAE)x=new M.wl(a,null,null)
-else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+else if(!!w.$isAE)x=new M.VT(a,null,null)
+else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!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=!!w.$isUn?new M.XT(a,null,null):new M.vy(a,null,null)
 z.u(0,a,x)
 return x},
-wR:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+RI:function(a){var z=J.x(a)
+if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
 else z=!0
 else z=!0
 else z=!1
@@ -15441,20 +16185,20 @@
 nR:function(a,b,c,d){var z,y,x,w,v,u
 z={}
 z.a=b
-J.SB(this.gPP(),z.a)
+J.n1(this.gPP(),z.a)
 y=this.grF()
 x=J.x(y)
-w=!!x.$isUC&&J.xC(z.a,"value")
+w=!!x.$isEa&&J.xC(z.a,"value")
 v=z.a
 if(w){new W.E9(y).Rz(0,v)
 if(d)return this.nD(c)
 x=this.ge2()
-x.$1(J.mu(c,x))}else{u=J.Is(v,"?")
+x.$1(J.mu(c,x))}else{u=J.RY(v,"?")
 if(u){x.gQg(y).Rz(0,z.a)
 x=z.a
 w=J.U6(x)
-z.a=w.Nj(x,0,J.xH(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
-x=new M.BL(z,this,u)
+z.a=w.Nj(x,0,J.Hn(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
+x=new M.WF(z,this,u)
 x.$1(J.mu(c,x))}this.gCd(this).u(0,z.a,c)
 return c},
 nD:[function(a){var z,y,x,w,v,u,t
@@ -15468,14 +16212,14 @@
 t=null}}else{u=null
 t=null}y.sP(z,a==null?"":H.d(a))
 if(t!=null&&!J.xC(w.gP(x),u)){y=w.gP(x)
-J.Fc(t.gvt(),y)}},"$1","ge2",2,0,15,35]},
-BL:{
-"^":"Xs:30;a,b,c",
-$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,157,"call"],
+J.Fc(t.gvt(),y)}},"$1","ge2",2,0,17,55]},
+WF:{
+"^":"Tp:10;a,b,c",
+$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,137,"call"],
 $isEH:true},
 b2:{
 "^":"Ap;rF<,E3,vt<,jS",
-HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","gfM",2,0,15,35],
+HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","gfM",2,0,17,55],
 Uh:[function(a){var z,y,x,w,v
 switch(this.jS){case"value":z=J.Vm(this.rF)
 J.Fc(this.vt,z)
@@ -15484,12 +16228,12 @@
 y=J.RE(z)
 x=y.gd4(z)
 J.Fc(this.vt,x)
-if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
+if(!!y.$isJK&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
 v=J.UQ(J.QE(!!J.x(w).$isvy?w:M.Ky(w)),"checked")
 if(v!=null)J.Fc(v,!1)}break
-case"selectedIndex":z=J.fa(this.rF)
+case"selectedIndex":z=J.Lr(this.rF)
 J.Fc(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,15,1],
+break}O.wR()},"$1","gCL",2,0,17,1],
 TR:function(a,b){return J.mu(this.vt,b)},
 gP:function(a){return J.Vm(this.vt)},
 sP:function(a,b){J.Fc(this.vt,b)
@@ -15506,7 +16250,7 @@
 return
 case"value":J.Fc(a,b==null?"":H.d(b))
 return}},IP:function(a){var z=J.x(a)
-if(!!z.$isUC)return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])
+if(!!z.$isEa)return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])
 switch(z.gt5(a)){case"checkbox":return $.FF().LX(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
 default:return z.gLm(a)}},pt:function(a){var z,y,x
@@ -15514,13 +16258,13 @@
 if(z.gMB(a)!=null){z=z.gMB(a)
 z.toString
 z=new W.wi(z)
-return z.ev(z,new M.WP(a))}else{y=M.bM(a)
+return z.ev(z,new M.iA(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.iA(a))}},bC:function(a){if(typeof a==="string")return H.BU(a,null,new M.fR())
+return x.ev(x,new M.qx(a))}},bC:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
 return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 YJG:{
-"^":"Xs:47;",
+"^":"Tp:64;",
 $0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -15534,35 +16278,35 @@
 v=document.createEvent("MouseEvent")
 J.Dh(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.mt:C.Nm.gtH(x)},
+return x.length===1?C.U3:C.Nm.geK(x)},
 $isEH:true},
 pp:{
-"^":"Xs:30;a",
+"^":"Tp:10;a",
 $1:[function(a){this.a.push(C.nI)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 ik:{
-"^":"Xs:30;b",
-$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,1,"call"],
+"^":"Tp:10;b",
+$1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-WP:{
-"^":"Xs:30;a",
+iA:{
+"^":"Tp:10;a",
 $1:function(a){var z,y
 z=this.a
 y=J.x(a)
-if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
-z=J.tE(z)
+if(!y.n(a,z))if(!!y.$isJK)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},
 $isEH:true},
-iA:{
-"^":"Xs:30;b",
+qx:{
+"^":"Tp:10;b",
 $1:function(a){var z=J.x(a)
 return!z.n(a,this.b)&&z.gMB(a)==null},
 $isEH:true},
-fR:{
-"^":"Xs:30;",
+LG:{
+"^":"Tp:10;",
 $1:function(a){return 0},
 $isEH:true},
 ee:{
@@ -15573,7 +16317,7 @@
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.nR.call(this,this,b,c,d)
 J.Vs(this.rF).Rz(0,b)
 if(d){M.pw(this.rF,c,b)
-return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
+return}J.n1(!!J.x(this.grF()).$isvy?this.grF():this,b)
 z=this.gCd(this)
 y=this.rF
 x=new M.b2(y,null,c,b)
@@ -15600,11 +16344,11 @@
 z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+d
 if(typeof console!="undefined")console.error(z)
 return},
-Yj:function(a,b){var z
+Mh:function(a,b){var z
 if(this.u2==null)return
 z=this.gCd(this).Rz(0,b)
 if(z!=null)J.x0(z)},
-GB:function(a){var z,y
+BM:function(a){var z,y
 if(this.u2==null)return
 for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 if(y!=null)J.x0(y)}this.u2=null},
@@ -15613,7 +16357,7 @@
 this.u2=z}return z},
 gPP:function(){return!!J.x(this.grF()).$isvy?this.grF():this},
 $isvy:true},
-yp:{
+bX:{
 "^":"a;ku,EA,Po"},
 ug:{
 "^":"V2;rF,u2,Vw",
@@ -15624,7 +16368,7 @@
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
 J.Vs(this.rF).Rz(0,b)
 if(d){M.pw(this.rF,c,b)
-return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
+return}J.n1(!!J.x(this.grF()).$isvy?this.grF():this,b)
 z=this.gCd(this)
 y=this.rF
 x=new M.b2(y,null,c,b)
@@ -15634,12 +16378,12 @@
 z.u(0,b,x)
 return x}},
 DT:{
-"^":"V2;Q2?,nF,os<,xU,q4?,Bx?,M5?,AD,VZ,rF,u2,Vw",
+"^":"V2;Q2?,nF,os<,xU,q4?,IO?,M5?,AD,VZ,rF,u2,Vw",
 grF:function(){return this.rF},
 gPP:function(){return!!J.x(this.rF).$isDT?this.rF:this},
 oq:function(a){var z,y
 z=this.os
-if(z!=null)z.x5()
+if(z!=null)z.NC()
 if(a.qd==null&&a.DK==null&&a.wA==null){z=this.os
 if(z!=null){z.S6(0)
 this.os=null
@@ -15648,7 +16392,7 @@
 this.os=y
 z.u(0,"iterator",y)}this.os.dE(a,this.Q2)
 return this.os},
-a5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+dI:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z=this.gnv(this)
 y=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
 x=this.VZ
@@ -15658,18 +16402,18 @@
 x.jb=y
 this.VZ=x}z=this.AD
 if(z==null){w=J.Do(this.rF)
-z=$.Lu()
+z=$.JM()
 v=z.t(0,w)
 if(v==null){v=w.implementation.createHTMLDocument("")
 z.u(0,w,v)}this.AD=v
 z=v}u=J.O2(z)
 $.rf().u(0,u,this.rF)
-t=new M.yp(a,null,null)
+t=new M.bX(a,null,null)
 for(s=J.LY(y),z=x!=null,r=0;s!=null;s=s.nextSibling,++r){q=z?x.QE(r):null
 M.Ky(M.X7(s,u,this.AD,q,a,b,c,null)).sVw(t)}t.EA=u.firstChild
 t.Po=u.lastChild
 return u},
-ZK:function(a,b){return this.a5(a,b,null)},
+ZK:function(a,b){return this.dI(a,b,null)},
 gzH:function(){return this.nF},
 szH:function(a){var z
 this.nF=a
@@ -15677,20 +16421,20 @@
 z=this.os
 if(z!=null){z.Wv=!1
 z.eY=null
-z.TC=null}},
+z.jq=null}},
 gnv:function(a){var z,y,x,w,v
 this.GC()
 z=J.Vs(this.rF).MW.getAttribute("ref")
 if(z!=null){y=M.bM(this.rF)
 x=y!=null?J.Vr(y,z):null
-if(x==null){w=M.aU(this.rF)
-if(w!=null)x=J.c1(w,"#"+z)}}else x=null
+if(x==null){w=M.Ci(this.rF)
+if(w!=null)x=J.Eh(w,"#"+z)}}else x=null
 if(x==null){x=this.q4
 if(x==null)return this.rF}v=J.Gc(!!J.x(x).$isvy?x:M.Ky(x))
 return v!=null?v:x},
 gjb:function(a){var z
 this.GC()
-z=this.Bx
+z=this.IO
 return z!=null?z:H.Go(this.rF,"$isOH").content},
 bt:function(a){var z,y,x,w,v,u,t
 if(this.M5===!0)return!1
@@ -15700,8 +16444,8 @@
 y=!z
 if(y){x=this.rF
 w=J.RE(x)
-if(w.gQg(x).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
-v=M.eX(this.rF)
+if(w.gQg(x).MW.hasAttribute("template")===!0&&C.z5.x4(w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+v=M.pZ(this.rF)
 v=!!J.x(v).$isvy?v:M.Ky(v)
 v.sM5(!0)
 z=!!J.x(v.grF()).$isOH
@@ -15719,20 +16463,20 @@
 v.sM5(!0)
 z=!!J.x(v.grF()).$isOH}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sBx(J.O2(M.Vo(v.grF())))
+u=!1}if(!z)v.sIO(J.O2(M.TA(v.grF())))
 if(a!=null)v.sq4(a)
 else if(y)M.KE(v,this.rF,u)
 else M.GM(J.NQ(v))
 return!0},
 GC:function(){return this.bt(null)},
 $isDT:true,
-static:{"^":"mn,EW,Sf,To",Vo:function(a){var z,y,x,w
+static:{"^":"mn,EW,Qn,vU",TA:function(a){var z,y,x,w
 z=J.Do(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},eX:function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},pZ:function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gBy(a).insertBefore(y,a)
@@ -15751,27 +16495,27 @@
 if(c){J.y2(z,b)
 return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
 z=new M.CE()
-y=J.MK(a,$.cz())
-if(M.wR(a))z.$1(a)
-y.aN(y,z)},oR:function(){if($.To===!0)return
-$.To=!0
+y=J.MK(a,$.i8())
+if(M.RI(a))z.$1(a)
+y.aN(y,z)},oR:function(){if($.vU===!0)return
+$.vU=!0
 var z=document.createElement("style",null)
-J.t3(z,H.d($.cz())+" { display: none; }")
+J.t3(z,H.d($.i8())+" { display: none; }")
 document.head.appendChild(z)}}},
 CE:{
-"^":"Xs:15;",
+"^":"Tp:17;",
 $1:function(a){if(!M.Ky(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.Ky(a)))},
 $isEH:true},
 W6o:{
-"^":"Xs:30;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,134,"call"],
+"^":"Tp:10;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 aR:{
-"^":"Xs:30;a,b,c",
+"^":"Tp:10;a,b,c",
 $1:function(a){return this.c.pm(a,this.a,this.b)},
 $isEH:true},
 NW:{
-"^":"Xs:50;a,b,c,d",
+"^":"Tp:67;a,b,c,d",
 $2:function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.xC(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
@@ -15787,11 +16531,11 @@
 z.push(y)}},
 $isEH:true},
 TG:{
-"^":"Ap;YS,SU,vy,lS,Jh,WI,bn,D2,ts,qe,ur,VC,Wv,eY,TC",
+"^":"Ap;YS,SU,vy,lS,Jh,WI,bn,D2,Ee,qe,ur,VC,Wv,eY,jq",
 RV:function(a){return this.eY.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
 gP:function(a){return this.bn},
-x5:function(){var z,y
+NC:function(){var z,y
 z=this.WI
 y=J.x(z)
 if(!!y.$isAp){y.S6(z)
@@ -15800,22 +16544,22 @@
 if(!!y.$isAp){y.S6(z)
 this.bn=null}},
 dE:function(a,b){var z,y,x
-this.x5()
+this.NC()
 z=this.YS.rF
 y=a.qd
 x=y!=null
 this.D2=x
-this.ts=a.wA!=null
+this.Ee=a.wA!=null
 if(x){this.qe=y.eq
-y=M.LH("if",y,z,b)
+y=M.GZ("if",y,z,b)
 this.WI=y
 if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
-return}}else H.Go(y,"$isAp").TR(0,this.goo())}if(this.ts===!0){y=a.wA
+return}}else H.Go(y,"$isAp").TR(0,this.goo())}if(this.Ee===!0){y=a.wA
 this.ur=y.eq
-y=M.LH("repeat",y,z,b)
+y=M.GZ("repeat",y,z,b)
 this.bn=y}else{y=a.DK
 this.ur=y.eq
-y=M.LH("bind",y,z,b)
+y=M.GZ("bind",y,z,b)
 this.bn=y}if(this.ur!==!0)J.mu(y,this.goo())
 this.vr(null)},
 vr:[function(a){var z,y
@@ -15824,55 +16568,55 @@
 z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
 return}}y=this.bn
 if(this.ur!==!0){H.Go(y,"$isAp")
-y=y.gP(y)}this.Io(this.ts!==!0?[y]:y)},"$1","goo",2,0,15,81],
+y=y.gP(y)}this.Io(this.Ee!==!0?[y]:y)},"$1","goo",2,0,17,11],
 Io:function(a){var z,y
 z=J.x(a)
-if(!z.$isWO)a=!!z.$iscX?z.br(a):[]
+if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
 z=this.vy
 if(a===z)return
 this.Ke()
 this.lS=a
-if(!!J.x(a).$iswn&&this.ts===!0&&this.ur!==!0){if(a.gID()!=null)a.sID([])
+if(!!J.x(a).$iswn&&this.Ee===!0&&this.ur!==!0){if(a.gb3()!=null)a.sb3([])
 this.VC=a.gRT().yI(this.gk8())}y=this.lS
 y=y!=null?y:[]
 this.cJ(G.jj(y,0,J.q8(y),z,0,z.length))},
-F1:function(a){var z,y,x,w
+Ih:function(a){var z,y,x,w
 z=J.x(a)
 if(z.n(a,-1))return this.YS.rF
 y=this.SU
 z=z.U(a,2)
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 x=y[z]
-if(M.wR(x)){z=this.YS.rF
+if(M.RI(x)){z=this.YS.rF
 z=x==null?z==null:x===z}else z=!0
 if(z)return x
 w=M.Ky(x).gos()
 if(w==null)return x
-return w.F1(C.jn.cU(w.SU.length,2)-1)},
+return w.Ih(C.jn.cU(w.SU.length,2)-1)},
 uy:function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
-y=this.F1(z.W(a,1))
+y=this.Ih(z.W(a,1))
 x=b!=null
 if(x)w=b.lastChild
-else w=c!=null&&J.z4(c)?J.MQ(c):null
+else w=c!=null&&J.yx(c)?J.MQ(c):null
 if(w==null)w=y
 z=z.U(a,2)
 H.IC(this.SU,z,[w,d])
 v=J.Tm(this.YS.rF)
-u=J.tx(y)
+u=J.p7(y)
 if(x)v.insertBefore(b,u)
 else if(c!=null)for(z=J.mY(c);z.G();)v.insertBefore(z.gl(),u)},
 ne:function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
 y=J.Wx(a)
-x=this.F1(y.W(a,1))
-w=this.F1(a)
+x=this.Ih(y.W(a,1))
+w=this.Ih(a)
 v=this.SU
-u=J.WB(y.U(a,2),1)
+u=J.ew(y.U(a,2),1)
 if(u>>>0!==u||u>=v.length)return H.e(v,u)
 t=v[u]
-C.Nm.UZ(v,y.U(a,2),J.WB(y.U(a,2),2))
+C.Nm.UZ(v,y.U(a,2),J.ew(y.U(a,2),2))
 J.Tm(this.YS.rF)
 for(y=J.RE(x);!J.xC(w,x);){s=y.guD(x)
 if(s==null?w==null:s===w)w=x
@@ -15880,7 +16624,7 @@
 if(v!=null)v.removeChild(s)
 z.push(s)}return new M.wS(z,t)},
 cJ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f
-if(this.Jh||J.FN(a)===!0)return
+if(this.Jh||J.tx(a)===!0)return
 t=this.YS
 s=t.rF
 if(J.Tm(s)==null){this.S6(0)
@@ -15889,31 +16633,31 @@
 z=t.nF
 if(!this.Wv){this.Wv=!0
 q=(!!J.x(t.rF).$isDT?t.rF:t).gzH()
-if(q!=null){this.eY=q.A5(s)
-this.TC=null}}p=P.YM(P.N3(),null,null,P.a,M.wS)
+if(q!=null){this.eY=q.CE(s)
+this.jq=null}}p=P.YM(P.N3(),null,null,P.a,M.wS)
 for(o=J.w1(a),n=o.gA(a),m=0;n.G();){l=n.gl()
-for(k=l.gRt(),k=k.gA(k),j=J.RE(l);k.G();)p.u(0,k.lo,this.ne(J.WB(j.gvH(l),m)))
+for(k=l.gRt(),k=k.gA(k),j=J.RE(l);k.G();)p.u(0,k.lo,this.ne(J.ew(j.gvH(l),m)))
 k=l.gNg()
 if(typeof k!=="number")return H.s(k)
 m-=k}for(o=o.gA(a);o.G();){l=o.gl()
-for(n=J.RE(l),i=n.gvH(l);J.u6(i,J.WB(n.gvH(l),l.gNg()));++i){if(i>>>0!==i||i>=r.length)return H.e(r,i)
+for(n=J.RE(l),i=n.gvH(l);J.u6(i,J.ew(n.gvH(l),l.gNg()));++i){if(i>>>0!==i||i>=r.length)return H.e(r,i)
 y=r[i]
 x=null
 h=p.Rz(0,y)
 w=null
-if(h!=null&&J.z4(J.Bq(h))){w=h.gWf()
+if(h!=null&&J.yx(J.Bq(h))){w=h.gpp()
 g=J.Bq(h)}else{try{w=[]
 if(this.eY!=null)y=this.RV(y)
-if(y!=null)x=t.a5(y,z,w)}catch(f){k=H.Ru(f)
+if(y!=null)x=t.dI(y,z,w)}catch(f){k=H.Ru(f)
 v=k
-u=new H.oP(f,null)
+u=new H.XO(f,null)
 k=new P.vs(0,$.X3,null,null,null,null,null,null)
 k.$builtinTypeInfo=[null]
 new P.Zf(k).$builtinTypeInfo=[null]
 j=v
 if(j==null)H.vh(P.u("Error must not be null"))
 if(k.Gv!==0)H.vh(P.w("Future already completed"))
-k.CG(j,u)}g=null}this.uy(i,x,g,w)}}for(t=p.gUQ(p),t=H.VM(new H.MH(null,J.mY(t.l6),t.T6),[H.Kp(t,0),H.Kp(t,1)]);t.G();)this.Ep(t.lo.gWf())},"$1","gk8",2,0,158,159],
+k.CG(j,u)}g=null}this.uy(i,x,g,w)}}for(t=p.gUQ(p),t=H.VM(new H.MH(null,J.mY(t.l6),t.T6),[H.Kp(t,0),H.Kp(t,1)]);t.G();)this.Ep(t.lo.gpp())},"$1","gk8",2,0,178,179],
 Ep:function(a){var z
 for(z=J.mY(a);z.G();)J.x0(z.gl())},
 Ke:function(){var z=this.VC
@@ -15925,11 +16669,11 @@
 this.Ke()
 for(z=this.SU,y=1;y<z.length;y+=2)this.Ep(z[y])
 C.Nm.sB(z,0)
-this.x5()
+this.NC()
 this.YS.os=null
 this.Jh=!0}},
 wS:{
-"^":"a;UN>,Wf<",
+"^":"a;UN>,pp<",
 $iswS:true},
 XT:{
 "^":"vy;rF,u2,Vw",
@@ -15937,20 +16681,20 @@
 if(!J.xC(b,"text"))return M.vy.prototype.nR.call(this,this,b,c,d)
 if(d){z=c==null?"":H.d(c)
 J.t3(this.rF,z)
-return}this.Yj(0,b)
-z=this.gMm()
+return}this.Mh(0,b)
+z=this.gmt()
 z.$1(J.mu(c,z))
 this.gCd(this).u(0,b,c)
 return c},
 ux:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gMm",2,0,30,16]},
-wl:{
+J.t3(this.rF,z)},"$1","gmt",2,0,10,18]},
+VT:{
 "^":"V2;rF,u2,Vw",
 grF:function(){return this.rF},
 nR:function(a,b,c,d){var z,y,x,w
 if(!J.xC(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
 if(d){M.pw(this.rF,c,b)
-return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
+return}J.n1(!!J.x(this.grF()).$isvy?this.grF():this,b)
 J.Vs(this.rF).Rz(0,b)
 z=this.gCd(this)
 y=this.rF
@@ -16000,7 +16744,7 @@
 x=z.length
 w=C.jn.cU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","gzf",2,0,160,16],
+return y+H.d(z[w])},"$1","gzf",2,0,180,18],
 cH:[function(a){var z,y,x,w,v,u,t,s
 z=this.jU
 if(0>=z.length)return H.e(z,0)
@@ -16011,9 +16755,9 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gB5",2,0,161,162],
+y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gB5",2,0,181,182],
 l3:function(a,b){this.V6=this.jU.length===5?this.gzf():this.gB5()},
-static:{"^":"OO,jO,t3a,epG,oM,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+static:{"^":"rz5,jO,t3a,epG,oM,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
 z=a.length
 for(y=b==null,x=J.U6(a),w=null,v=0,u=!0;v<z;){t=x.XU(a,"{{",v)
@@ -16043,7 +16787,7 @@
 I5:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 static:{cF:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -16057,14 +16801,14 @@
 return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
 el:{
-"^":"V37;uB,lc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V47;uB,lc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-RF:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,15,65],
+RF:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,17,82],
 static:{oH:function(a){var z,y,x,w
-z=$.Nd()
+z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
@@ -16072,45 +16816,45 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.nt.ZL(a)
-C.nt.XI(a)
+C.bV.ZL(a)
+C.bV.XI(a)
 return a}}},
-V37:{
+V47:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
 P.KN.$isKN=true
-P.KN.$isIj=true
-P.KN.$asIj=[P.FK]
+P.KN.$isRz=true
+P.KN.$asRz=[P.FK]
 P.KN.$isa=true
 P.CP.$isCP=true
-P.CP.$isIj=true
-P.CP.$asIj=[P.FK]
+P.CP.$isRz=true
+P.CP.$asRz=[P.FK]
 P.CP.$isa=true
 W.KV.$isKV=true
 W.KV.$isa=true
 W.my.$isa=true
 W.yg.$isa=true
-W.M5.$isa=true
+W.QI.$isa=true
 P.qU.$isqU=true
-P.qU.$isIj=true
-P.qU.$asIj=[P.qU]
+P.qU.$isRz=true
+P.qU.$asRz=[P.qU]
 P.qU.$isa=true
-P.FK.$isIj=true
-P.FK.$asIj=[P.FK]
+P.FK.$isRz=true
+P.FK.$asRz=[P.FK]
 P.FK.$isa=true
+N.qV.$isRz=true
+N.qV.$asRz=[N.qV]
+N.qV.$isa=true
 P.a6.$isa6=true
-P.a6.$isIj=true
-P.a6.$asIj=[P.a6]
+P.a6.$isRz=true
+P.a6.$asRz=[P.a6]
 P.a6.$isa=true
 P.qv.$isa=true
 P.WO.$isWO=true
-P.WO.$iscX=true
+P.WO.$isQV=true
 P.WO.$isa=true
-N.qV.$isIj=true
-N.qV.$asIj=[N.qV]
-N.qV.$isa=true
 W.h4.$ish4=true
 W.h4.$isKV=true
 W.h4.$isa=true
@@ -16120,13 +16864,13 @@
 K.O1.$isa=true
 U.WH.$ishw=true
 U.WH.$isa=true
-U.Jy.$ishw=true
-U.Jy.$isa=true
+U.Nb.$ishw=true
+U.Nb.$isa=true
 U.zX.$iszX=true
 U.zX.$ishw=true
 U.zX.$isa=true
-U.Cu.$ishw=true
-U.Cu.$isa=true
+U.ma.$ishw=true
+U.ma.$isa=true
 U.HB.$ishw=true
 U.HB.$isa=true
 U.Mp.$ishw=true
@@ -16146,19 +16890,20 @@
 U.ae.$isa=true
 U.Qb.$ishw=true
 U.Qb.$isa=true
-T.yj.$isyj=true
-T.yj.$isa=true
 P.IN.$isIN=true
 P.IN.$isa=true
+P.uq.$isa=true
+N.Rw.$isa=true
+T.yj.$isyj=true
+T.yj.$isa=true
 G.DA.$isDA=true
 G.DA.$isa=true
-N.JM.$isa=true
 G.Y2.$isY2=true
 G.Y2.$isa=true
 W.tV.$ish4=true
 W.tV.$isKV=true
 W.tV.$isa=true
-P.uq.$isa=true
+F.d3.$isa=true
 A.XP.$isa=true
 A.Ap.$isa=true
 L.Tv.$isTv=true
@@ -16166,7 +16911,6 @@
 P.a2.$isa2=true
 P.a2.$isa=true
 M.wS.$isa=true
-F.d3.$isa=true
 W.ea.$isea=true
 W.ea.$isa=true
 P.cb.$iscb=true
@@ -16202,16 +16946,18 @@
 D.c2.$isc2=true
 D.c2.$isa=true
 W.fJ.$isa=true
-W.ew.$isea=true
-W.ew.$isa=true
+W.kQ.$isea=true
+W.kQ.$isa=true
 D.kx.$iskx=true
 D.kx.$isaf=true
 D.kx.$isa=true
-D.D5.$isa=true
+D.t9.$isa=true
 D.HJ.$isa=true
 W.AW.$isea=true
 W.AW.$isa=true
-H.zL.$isa=true
+N.HV.$isHV=true
+N.HV.$isa=true
+H.yo.$isa=true
 H.IY.$isa=true
 H.aX.$isa=true
 W.I0.$isKV=true
@@ -16220,42 +16966,50 @@
 U.hw.$ishw=true
 U.hw.$isa=true
 G.Ni.$isa=true
+P.qK.$isqK=true
+P.qK.$isa=true
+P.xp.$isxp=true
+P.xp.$isa=true
 P.mE.$ismE=true
 P.mE.$isa=true
-P.DR.$isDR=true
-P.DR.$isoK=true
-P.DR.$isMO=true
-P.DR.$isa=true
-P.f6.$isf6=true
-P.f6.$isDR=true
-P.f6.$isoK=true
-P.f6.$isMO=true
-P.f6.$isa=true
+P.KA.$isKA=true
+P.KA.$isNOT=true
+P.KA.$isMO=true
+P.KA.$isa=true
+P.LR.$isLR=true
+P.LR.$isKA=true
+P.LR.$isNOT=true
+P.LR.$isMO=true
+P.LR.$isa=true
 V.qC.$isqC=true
 V.qC.$isZ0=true
 V.qC.$isa=true
-P.Ij.$isIj=true
-P.Ij.$isa=true
-P.cX.$iscX=true
-P.cX.$isa=true
+P.Rz.$isRz=true
+P.Rz.$isa=true
+P.aY.$isaY=true
+P.aY.$isa=true
+P.Z0.$isZ0=true
+P.Z0.$isa=true
+P.Xa.$isXa=true
+P.Xa.$isa=true
+P.QV.$isQV=true
+P.QV.$isa=true
 P.b8.$isb8=true
 P.b8.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
-P.oK.$isoK=true
-P.oK.$isa=true
+P.NOT.$isNOT=true
+P.NOT.$isa=true
 P.fIm.$isfIm=true
 P.fIm.$isa=true
 P.iP.$isiP=true
-P.iP.$isIj=true
-P.iP.$asIj=[null]
+P.iP.$isRz=true
+P.iP.$asRz=[null]
 P.iP.$isa=true
 O.Hz.$isHz=true
 O.Hz.$isa=true
 L.AR.$isAR=true
 L.AR.$isa=true
-P.Z0.$isZ0=true
-P.Z0.$isa=true
 D.N7.$isN7=true
 D.N7.$isaf=true
 D.N7.$isa=true
@@ -16265,7 +17019,7 @@
 J.Qc=function(a){if(typeof a=="number")return J.P.prototype
 if(typeof a=="string")return J.O.prototype
 if(a==null)return a
-if(!(a instanceof P.a))return J.zH.prototype
+if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
@@ -16279,11 +17033,11 @@
 return J.m0(a)}
 J.Wx=function(a){if(typeof a=="number")return J.P.prototype
 if(a==null)return a
-if(!(a instanceof P.a))return J.zH.prototype
+if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
 J.rY=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
-if(!(a instanceof P.a))return J.zH.prototype
+if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
 J.w1=function(a){if(a==null)return a
 if(a.constructor==Array)return J.Q.prototype
@@ -16292,7 +17046,7 @@
 return J.m0(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.L7.prototype
 return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
-if(a==null)return J.Jh.prototype
+if(a==null)return J.ht.prototype
 if(typeof a=="boolean")return J.yEe.prototype
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
@@ -16308,7 +17062,7 @@
 J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
 J.Ak=function(a){return J.RE(a).ghy(a)}
 J.Aw=function(a){return J.RE(a).gb6(a)}
-J.B9=function(a){return J.RE(a).gL0(a)}
+J.B9=function(a,b){return J.RE(a).shN(a,b)}
 J.BC=function(a,b){return J.RE(a).sja(a,b)}
 J.BT=function(a){return J.RE(a).gNG(a)}
 J.Bj=function(a,b){return J.RE(a).Tk(a,b)}
@@ -16316,11 +17070,11 @@
 return J.Wx(a).E(a,b)}
 J.Bq=function(a){return J.RE(a).gUN(a)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
-J.C5=function(a,b){return J.RE(a).snN(a,b)}
+J.C3=function(a,b){return J.RE(a).sig(a,b)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-J.CN=function(a){return J.RE(a).gd0(a)}
 J.Cm=function(a){return J.RE(a).gvC(a)}
-J.D9=function(a){return J.RE(a).GB(a)}
+J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
+J.DB=function(a){return J.RE(a).BM(a)}
 J.DF=function(a,b){return J.RE(a).soc(a,b)}
 J.DL=function(a){return J.RE(a).gK4(a)}
 J.DO=function(a){return J.RE(a).gR(a)}
@@ -16330,47 +17084,45 @@
 J.Do=function(a){return J.RE(a).gM0(a)}
 J.Dq=function(a,b){return J.w1(a).Rz(a,b)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
+J.Du=function(a){return J.RE(a).gxN(a)}
 J.E3=function(a){return J.RE(a).gRu(a)}
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
-J.Eh=function(a,b){return J.Wx(a).O(a,b)}
+J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
 J.Er=function(a,b){return J.RE(a).sfY(a,b)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
-J.Ex=function(a,b){return J.RE(a).sjl(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
-J.FI=function(a){return J.RE(a).gig(a)}
-J.FN=function(a){return J.U6(a).gl0(a)}
+J.FI=function(a,b,c,d){return J.RE(a).YJ(a,b,c,d)}
 J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
 J.FW=function(a,b){return J.rY(a).j(a,b)}
 J.Fc=function(a,b){return J.RE(a).sP(a,b)}
-J.Ff=function(a){return J.RE(a).gXN(a)}
-J.Fg=function(a,b){return J.RE(a).sKE(a,b)}
+J.GF=function(a,b){return J.RE(a).spM(a,b)}
 J.GT=function(a,b){return J.RE(a).sQl(a,b)}
 J.GW=function(a){return J.RE(a).gVY(a)}
-J.GZ=function(a,b){return J.RE(a).sph(a,b)}
 J.Gc=function(a){return J.RE(a).gnv(a)}
 J.H3=function(a,b){return J.RE(a).sZA(a,b)}
-J.HF=function(a,b){return J.RE(a).sX0(a,b)}
-J.HO=function(a){return J.RE(a).Zi(a)}
-J.Hr=function(a,b){return J.RE(a).shN(a,b)}
+J.HF=function(a){return J.RE(a).gD7(a)}
+J.HO=function(a){return J.RE(a).gWw(a)}
+J.Hf=function(a){return J.RE(a).gd0(a)}
+J.Hn=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
+return J.Wx(a).W(a,b)}
+J.Hr=function(a){return J.RE(a).gL0(a)}
 J.I1=function(a){return J.RE(a).gSf(a)}
 J.I2=function(a){return J.RE(a).gwv(a)}
 J.II=function(a){return J.w1(a).Jd(a)}
 J.IO=function(a){return J.RE(a).gRH(a)}
 J.IX=function(a,b){return J.RE(a).sEu(a,b)}
 J.Ip=function(a,b){return J.RE(a).QS(a,b)}
-J.Is=function(a,b){return J.rY(a).Tc(a,b)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
 J.JA=function(a,b,c){return J.rY(a).h8(a,b,c)}
+J.JD=function(a){return J.RE(a).gSs(a)}
 J.JG=function(a){return J.RE(a).gHn(a)}
-J.JV=function(a,b){return J.RE(a).sEl(a,b)}
 J.JZ=function(a,b){return J.RE(a).st0(a,b)}
 J.Ja=function(a){return J.RE(a).gr9(a)}
 J.Jb=function(a,b){return J.RE(a).sdu(a,b)}
 J.Jj=function(a){return J.RE(a).gWA(a)}
-J.Jn=function(a,b){return J.RE(a).swv(a,b)}
 J.Jp=function(a){return J.RE(a).gjl(a)}
 J.Jr=function(a,b){return J.RE(a).Id(a,b)}
 J.K0=function(a){return J.RE(a).gd4(a)}
@@ -16380,79 +17132,87 @@
 J.Kl=function(a){return J.RE(a).gBP(a)}
 J.Kn=function(a){return J.Wx(a).yu(a)}
 J.Kt=function(a){return J.RE(a).gG3(a)}
+J.Kz=function(a,b){return J.RE(a).sni(a,b)}
 J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
 return J.Wx(a).V(a,b)}
 J.LB=function(a){return J.RE(a).gX0(a)}
 J.LE=function(a){return J.RE(a).VD(a)}
 J.LL=function(a){return J.Wx(a).HG(a)}
 J.LM=function(a,b){return J.RE(a).szj(a,b)}
+J.LP=function(a,b){return J.RE(a).sJ6(a,b)}
 J.LY=function(a){return J.RE(a).gPZ(a)}
 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.Ln=function(a){return J.RE(a).gdU(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
-J.M3=function(a,b){return J.RE(a).snZ(a,b)}
+J.Lr=function(a){return J.RE(a).gMj(a)}
 J.M4=function(a){return J.RE(a).gJN(a)}
 J.ME=function(a,b){return J.RE(a).sUo(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.Mb=function(a){return J.RE(a).gSY(a)}
+J.MX=function(a,b){return J.RE(a).sPj(a,b)}
+J.Mi=function(a,b){return J.RE(a).sWA(a,b)}
 J.Mo=function(a){return J.RE(a).gx6(a)}
-J.Mx=function(a,b,c){return J.w1(a).aP(a,b,c)}
+J.Mx=function(a){return J.RE(a).gks(a)}
 J.Mz=function(a){return J.RE(a).goE(a)}
 J.N1=function(a){return J.RE(a).Es(a)}
-J.NO=function(a){return J.RE(a).VH(a)}
+J.NO=function(a,b){return J.RE(a).soE(a,b)}
 J.NQ=function(a){return J.RE(a).gjb(a)}
+J.NT=function(a,b,c){return J.U6(a).eM(a,b,c)}
+J.Nd=function(a){return J.w1(a).br(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
 J.Nh=function(a,b){return J.RE(a).sSY(a,b)}
 J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
 J.Nl=function(a){return J.RE(a).gO3(a)}
 J.O2=function(a){return J.RE(a).JP(a)}
+J.O6=function(a){return J.RE(a).goc(a)}
 J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.OL=function(a){return J.RE(a).gQl(a)}
-J.OS=function(a,b){return J.w1(a).tt(a,b)}
-J.Ok=function(a,b){return J.RE(a).vV(a,b)}
+J.OT=function(a){return J.RE(a).gXE(a)}
+J.Ok=function(a){return J.RE(a).ghU(a)}
 J.Oo=function(a,b){return J.RE(a).sjT(a,b)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
 J.P5=function(a){return J.RE(a).gHo(a)}
-J.P6=function(a,b){return J.RE(a).sZ2(a,b)}
 J.PB=function(a){return J.RE(a).gI(a)}
-J.PP=function(a){return J.RE(a).gEu(a)}
+J.PN=function(a,b){return J.RE(a).sCI(a,b)}
+J.PP=function(a,b){return J.RE(a).snv(a,b)}
 J.PY=function(a){return J.RE(a).goN(a)}
 J.Pk=function(a,b){return J.RE(a).svu(a,b)}
 J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
-J.Pq=function(a,b){return J.RE(a).sig(a,b)}
 J.Pr=function(a){return J.RE(a).gU4(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
 J.Q4=function(a){return J.RE(a).gph(a)}
 J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
-J.QD=function(a){return J.RE(a).gdB(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
+J.QT=function(a,b){return J.RE(a).vV(a,b)}
 J.QX=function(a){return J.RE(a).gUo(a)}
+J.QZ=function(a){return J.RE(a).gpM(a)}
+J.Qa=function(a){return J.RE(a).gNN(a)}
 J.Qd=function(a){return J.RE(a).gRn(a)}
-J.Qf=function(a,b){return J.RE(a).soE(a,b)}
-J.Qk=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
-J.Qv=function(a){return J.RE(a).gSs(a)}
+J.Qv=function(a,b){return J.RE(a).sX0(a,b)}
 J.Qy=function(a,b){return J.RE(a).shf(a,b)}
-J.R6=function(a,b){return J.RE(a).sCI(a,b)}
+J.R1=function(a){return J.RE(a).Fn(a)}
 J.RC=function(a){return J.RE(a).gTA(a)}
 J.RF=function(a,b){return J.RE(a).WO(a,b)}
+J.RX=function(a,b){return J.RE(a).sjl(a,b)}
+J.RY=function(a,b){return J.rY(a).Tc(a,b)}
+J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
 J.Ry=function(a){return J.RE(a).gLW(a)}
 J.S2=function(a,b){return J.RE(a).jn(a,b)}
 J.S5=function(a,b){return J.RE(a).sbA(a,b)}
 J.S9=function(a){return J.RE(a).gyX(a)}
-J.SB=function(a,b){return J.RE(a).Yj(a,b)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
 J.SK=function(a){return J.RE(a).xW(a)}
 J.SM=function(a){return J.RE(a).gbw(a)}
+J.SS=function(a,b){return J.RE(a).sIt(a,b)}
 J.SZ=function(a){return J.RE(a).gSO(a)}
+J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
 J.Sj=function(a,b){return J.RE(a).svC(a,b)}
 J.Sl=function(a){return J.RE(a).gxb(a)}
-J.Sm=function(a,b){return J.RE(a).skZ(a,b)}
 J.Sz=function(a){return J.RE(a).gUx(a)}
 J.Td=function(a){return J.RE(a).gpf(a)}
 J.Tm=function(a){return J.RE(a).gBy(a)}
@@ -16460,7 +17220,9 @@
 J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
 J.U2=function(a){return J.w1(a).V1(a)}
-J.U8=function(a){return J.RE(a).gUQ(a)}
+J.U8=function(a){return J.RE(a).gEQ(a)}
+J.U8o=function(a){return J.RE(a).gUQ(a)}
+J.UC=function(a){return J.RE(a).dQ(a)}
 J.UM=function(a){return J.RE(a).gu7(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
@@ -16473,16 +17235,17 @@
 J.VL=function(a){return J.RE(a).gR2(a)}
 J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.Vi=function(a){return J.RE(a).grO(a)}
+J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Vl=function(a){return J.RE(a).gja(a)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vr=function(a,b){return J.RE(a).Kb(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
-J.Vw=function(a,b,c){return J.U6(a).Is(a,b,c)}
+J.Vw=function(a,b){return J.U6(a).sB(a,b)}
 J.W2=function(a){return J.RE(a).gCf(a)}
-J.WB=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
-return J.Qc(a).g(a,b)}
+J.WA=function(a){return J.RE(a).gMZ(a)}
+J.WB=function(a,b){return J.RE(a).skZ(a,b)}
 J.WI=function(a,b){return J.RE(a).sLF(a,b)}
-J.WS=function(a){return J.RE(a).gD7(a)}
+J.WM=function(a){return J.RE(a).gyv(a)}
 J.WT=function(a){return J.RE(a).gFR(a)}
 J.WX=function(a){return J.RE(a).gbJ(a)}
 J.WY=function(a){return J.RE(a).gnp(a)}
@@ -16493,26 +17256,26 @@
 J.Yf=function(a){return J.w1(a).gIr(a)}
 J.Yq=function(a){return J.RE(a).gSR(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
+J.ZI=function(a,b){return J.RE(a).sIs(a,b)}
 J.ZL=function(a){return J.RE(a).gAF(a)}
 J.ZN=function(a){return J.RE(a).gqN(a)}
 J.ZU=function(a,b){return J.RE(a).sRY(a,b)}
 J.ZZ=function(a,b){return J.rY(a).yn(a,b)}
-J.Zg=function(a,b){return J.RE(a).sqw(a,b)}
 J.Zv=function(a){return J.RE(a).grs(a)}
 J.a8=function(a,b){return J.RE(a).sdU(a,b)}
 J.aA=function(a){return J.RE(a).gzY(a)}
 J.aT=function(a){return J.RE(a).god(a)}
+J.aw=function(a,b){return J.RE(a).sNN(a,b)}
 J.bB=function(a){return J.x(a).gbx(a)}
 J.ba=function(a){return J.RE(a).gKJ(a)}
 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.br=function(a,b){return J.w1(a).XP(a,b)}
 J.bu=function(a){return J.RE(a).gyw(a)}
-J.c1=function(a,b){return J.RE(a).Wk(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cO=function(a){return J.RE(a).gjx(a)}
+J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
 J.cU=function(a){return J.RE(a).gHh(a)}
-J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cd=function(a){return J.RE(a).gql(a)}
 J.cl=function(a,b){return J.RE(a).sHt(a,b)}
 J.co=function(a,b){return J.rY(a).nC(a,b)}
@@ -16520,45 +17283,48 @@
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
-J.dy=function(a){return J.RE(a).gqw(a)}
+J.dq=function(a){return J.RE(a).gJD(a)}
 J.eU=function(a){return J.RE(a).gY9(a)}
+J.ew=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
+return J.Qc(a).g(a,b)}
 J.fA=function(a){return J.RE(a).gJp(a)}
 J.fD=function(a){return J.RE(a).e6(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
-J.fa=function(a){return J.RE(a).gMj(a)}
+J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
+J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.fc=function(a,b){return J.RE(a).sR(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
 J.fv=function(a,b){return J.RE(a).sUx(a,b)}
 J.fw=function(a){return J.RE(a).gEl(a)}
-J.fx=function(a){return J.RE(a).gtu(a)}
+J.fy=function(a){return J.RE(a).gIF(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
 J.hb=function(a){return J.RE(a).gQ1(a)}
-J.ht=function(a){return J.RE(a).gZ2(a)}
+J.hn=function(a){return J.RE(a).gEu(a)}
 J.i9=function(a,b){return J.w1(a).Zv(a,b)}
 J.iH=function(a,b){return J.RE(a).sDQ(a,b)}
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iM=function(a,b){return J.RE(a).st5(a,b)}
+J.iS=function(a){return J.RE(a).gox(a)}
 J.iY=function(a){return J.RE(a).gnN(a)}
+J.ih=function(a){return J.RE(a).ga5(a)}
 J.io=function(a){return J.RE(a).gBV(a)}
-J.is=function(a){return J.RE(a).gni(a)}
+J.is=function(a){return J.RE(a).gZm(a)}
 J.iz=function(a,b){return J.RE(a).GE(a,b)}
 J.j1=function(a){return J.RE(a).gZA(a)}
 J.jH=function(a){return J.RE(a).ghN(a)}
-J.jM=function(a,b){return J.RE(a).sPj(a,b)}
-J.jd=function(a){return J.RE(a).gZm(a)}
+J.jP=function(a){return J.RE(a).gbA(a)}
+J.jd=function(a,b){return J.RE(a).snZ(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.jl=function(a){return J.RE(a).gHt(a)}
 J.jo=function(a){return J.RE(a).gCI(a)}
 J.jzo=function(a){if(typeof a=="number")return-a
 return J.Wx(a).J(a)}
-J.k7=function(a){return J.RE(a).gbA(a)}
+J.k7=function(a,b){return J.RE(a).sGd(a,b)}
 J.kB=function(a,b){return J.RE(a).sFR(a,b)}
 J.kE=function(a){return J.w1(a).git(a)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
-J.kS=function(a){return J.RE(a).gVU(a)}
-J.kT=function(a,b){return J.RE(a).snv(a,b)}
 J.kW=function(a,b,c){if((a.constructor==Array||H.Gp(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.kX=function(a,b){return J.RE(a).sNb(a,b)}
@@ -16569,75 +17335,86 @@
 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.l7=function(a,b){return J.RE(a).sv8(a,b)}
-J.lN=function(a){return J.RE(a).gil(a)}
+J.lB=function(a){return J.RE(a).guT(a)}
 J.lT=function(a){return J.RE(a).gOd(a)}
+J.lf=function(a,b){return J.Wx(a).O(a,b)}
 J.ls=function(a){return J.RE(a).gt3(a)}
+J.m4=function(a){return J.RE(a).gig(a)}
 J.m9=function(a,b){return J.RE(a).wR(a,b)}
+J.mB=function(a){return J.RE(a).Zi(a)}
 J.mP=function(a){return J.RE(a).gzj(a)}
+J.mU=function(a,b){return J.RE(a).skm(a,b)}
 J.mY=function(a){return J.w1(a).gA(a)}
-J.mb=function(a,b){return J.RE(a).sWA(a,b)}
 J.mu=function(a,b){return J.RE(a).TR(a,b)}
+J.n1=function(a,b){return J.RE(a).Mh(a,b)}
 J.n9=function(a){return J.RE(a).gQq(a)}
 J.nA=function(a,b){return J.RE(a).sPL(a,b)}
 J.nG=function(a){return J.RE(a).gv8(a)}
+J.np=function(a,b){return J.w1(a).tt(a,b)}
 J.ns=function(a){return J.RE(a).gjT(a)}
+J.nt=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.o0=function(a,b){return J.RE(a).sRu(a,b)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
 J.oL=function(a){return J.RE(a).gWT(a)}
+J.oN=function(a){return J.RE(a).gj4(a)}
 J.oO=function(a,b){return J.RE(a).siJ(a,b)}
-J.oe=function(a){return J.RE(a).gks(a)}
 J.okV=function(a,b){return J.RE(a).RR(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
+J.p7=function(a){return J.RE(a).guD(a)}
 J.pB=function(a){return J.RE(a).gDX(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
 J.pW=function(a,b,c,d){return J.RE(a).Si(a,b,c,d)}
-J.pj=function(a,b){return J.RE(a).sni(a,b)}
+J.pd=function(a){return J.RE(a).gni(a)}
 J.pm=function(a){return J.RE(a).gt0(a)}
 J.q0=function(a,b){return J.RE(a).syG(a,b)}
 J.q6=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.q8=function(a){return J.U6(a).gB(a)}
-J.qA=function(a){return J.w1(a).br(a)}
+J.qA=function(a,b){return J.RE(a).sqw(a,b)}
 J.ql=function(a){return J.RE(a).gV5(a)}
 J.qq=function(a,b){return J.RE(a).sNG(a,b)}
-J.qr=function(a,b){return J.RE(a).sGd(a,b)}
 J.r0=function(a,b){return J.Wx(a).Sy(a,b)}
 J.r4=function(a){return J.RE(a).pj(a)}
+J.ra=function(a){return J.RE(a).gJ6(a)}
 J.rr=function(a){return J.rY(a).bS(a)}
 J.rw=function(a){return J.RE(a).gMl(a)}
-J.ry=function(a,b){return J.RE(a).stu(a,b)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
-J.tE=function(a){return J.RE(a).goc(a)}
 J.tF=function(a){return J.RE(a).gyW(a)}
+J.tH=function(a,b){return J.RE(a).sHy(a,b)}
+J.tQ=function(a,b){return J.RE(a).swv(a,b)}
+J.tp=function(a){return J.RE(a).gHy(a)}
 J.tv=function(a,b){return J.RE(a).sDX(a,b)}
-J.tx=function(a){return J.RE(a).guD(a)}
-J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
+J.tx=function(a){return J.U6(a).gl0(a)}
+J.u1=function(a){return J.RE(a).gSY(a)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
+J.u9=function(a){return J.RE(a).gVU(a)}
 J.uH=function(a,b){return J.rY(a).Fr(a,b)}
 J.uM=function(a,b){return J.RE(a).sod(a,b)}
 J.uP=function(a){return J.RE(a).gVE(a)}
 J.uW=function(a){return J.RE(a).gyG(a)}
+J.uX=function(a,b){return J.RE(a).sph(a,b)}
 J.uf=function(a){return J.RE(a).gxr(a)}
 J.ul=function(a,b,c){return J.w1(a).UZ(a,b,c)}
 J.un=function(a){return J.RE(a).giJ(a)}
 J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
+J.vH=function(a){return J.RE(a).Kn(a)}
 J.vI=function(a,b,c){return J.RE(a).D9(a,b,c)}
 J.vP=function(a){return J.RE(a).My(a)}
-J.vU=function(a,b){return J.RE(a).skm(a,b)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
 J.vi=function(a){return J.RE(a).gNa(a)}
 J.vo=function(a,b){return J.w1(a).ev(a,b)}
-J.vr=function(a){return J.RE(a).dQ(a)}
 J.w7=function(a,b){return J.RE(a).syW(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
 J.wJ=function(a,b){return J.RE(a).slp(a,b)}
 J.wO=function(a){return J.RE(a).gE7(a)}
-J.wg=function(a,b){return J.U6(a).sB(a,b)}
+J.wd=function(a){return J.RE(a).gqw(a)}
+J.wg=function(a,b){return J.RE(a).snN(a,b)}
+J.wl=function(a,b){return J.RE(a).Ch(a,b)}
 J.wp=function(a){return J.w1(a).zB(a)}
 J.wz=function(a){return J.RE(a).gzx(a)}
 J.x0=function(a){return J.RE(a).S6(a)}
@@ -16645,32 +17422,27 @@
 J.xC=function(a,b){if(a==null)return b==null
 if(typeof a!="object")return b!=null&&a===b
 return J.x(a).n(a,b)}
-J.xH=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
-return J.Wx(a).W(a,b)}
+J.xH=function(a,b){return J.RE(a).sE7(a,b)}
 J.xR=function(a){return J.RE(a).ghf(a)}
-J.xZ=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
-return J.Wx(a).D(a,b)}
+J.xW=function(a,b){return J.RE(a).sZm(a,b)}
 J.xa=function(a){return J.RE(a).geS(a)}
 J.xq=function(a,b){return J.w1(a).Vr(a,b)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
 J.y9=function(a){return J.RE(a).lh(a)}
 J.yA=function(a){return J.RE(a).gvu(a)}
-J.yB=function(a,b){return J.RE(a).sIt(a,b)}
-J.yK=function(a){return J.RE(a).gWw(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.ye=function(a,b){return J.RE(a).sE7(a,b)}
 J.yi=function(a){return J.RE(a).gbN(a)}
 J.yn=function(a){return J.RE(a).gkZ(a)}
-J.yo=function(a){return J.RE(a).gPW(a)}
 J.yq=function(a){return J.RE(a).gNs(a)}
+J.yx=function(a){return J.U6(a).gor(a)}
 J.yz=function(a){return J.RE(a).gLF(a)}
 J.z2=function(a){return J.RE(a).gG1(a)}
 J.z3=function(a){return J.RE(a).gu6(a)}
-J.z4=function(a){return J.U6(a).gor(a)}
-J.zD=function(a){return J.RE(a).gKE(a)}
+J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
+return J.Wx(a).D(a,b)}
+J.zH=function(a){return J.RE(a).gIs(a)}
 J.zN=function(a){return J.RE(a).gM6(a)}
 J.zY=function(a){return J.RE(a).gdu(a)}
-J.zg=function(a){return J.RE(a).glQ(a)}
 J.zj=function(a){return J.RE(a).gvH(a)}
 C.Gx=X.hV.prototype
 C.J0=B.G6.prototype
@@ -16683,73 +17455,89 @@
 C.O0=R.JI.prototype
 C.OD=F.ZP.prototype
 C.Gh=L.nJ.prototype
-C.qL=R.Eg.prototype
-C.Yl=D.i7.prototype
+C.UF=R.Eg.prototype
+C.MC=D.i7.prototype
 C.by=A.Gk.prototype
+C.Cl=X.MJ.prototype
+C.uG=X.Nr.prototype
 C.Xo=U.DK.prototype
-C.p0=N.BS.prototype
-C.pJ=O.Vb.prototype
+C.cI=N.BS.prototype
+C.Cs=O.Vb.prototype
 C.Vc=K.Ly.prototype
 C.W3=W.fJ.prototype
 C.Ie=E.mO.prototype
 C.Ig=E.DE.prototype
 C.NK=E.U1.prototype
-C.wd=E.L4.prototype
+C.lX=E.ou.prototype
+C.Wa=E.av.prototype
+C.bZ=E.uz.prototype
+C.iR=E.Ma.prototype
+C.RVQ=E.wN.prototype
+C.wP=E.ds.prototype
+C.Ag=E.Mb.prototype
+C.Tl=E.oF.prototype
+C.wK=E.qh.prototype
+C.to=E.Q6.prototype
+C.za=E.L4.prototype
+C.ij=E.Zn.prototype
+C.Rr=E.uE.prototype
+C.aV=E.n5.prototype
 C.EL=B.pR.prototype
-C.yd=Z.hx.prototype
-C.wQ=D.Mc.prototype
-C.rC=D.Qh.prototype
+C.ry=Z.hx.prototype
+C.wQ=D.YA.prototype
+C.kd=D.Qh.prototype
 C.uF=A.fl.prototype
-C.bb=X.kK.prototype
+C.kS=X.kK.prototype
 C.LN=N.oa.prototype
 C.F2=D.IW.prototype
 C.Ji=D.Oz.prototype
-C.nM=D.St.prototype
-C.BJ=L.qk.prototype
+C.Hj=D.St.prototype
+C.Xe=L.qk.prototype
 C.Nm=J.Q.prototype
-C.ON=J.Pp.prototype
+C.YI=J.Pp.prototype
 C.jn=J.L7.prototype
-C.jN=J.Jh.prototype
+C.jN=J.ht.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
 C.ct=A.UK.prototype
 C.Z3=R.LU.prototype
 C.MG=M.CX.prototype
-C.mU=H.eEV.prototype
+C.yp=H.eEV.prototype
 C.kD=A.md.prototype
 C.SU=A.Bm.prototype
 C.nn=A.Ya.prototype
 C.J7=A.Ww.prototype
-C.t5=W.yk.prototype
+C.t5=W.BH.prototype
 C.k0=V.F1.prototype
-C.Pf=Z.uL.prototype
+C.mk=Z.uL.prototype
 C.Sx=J.iC.prototype
-C.Vk=A.ir.prototype
-C.Cc=Q.qZ.prototype
-C.oA=T.Uy.prototype
+C.Ki=A.ir.prototype
+C.Vp=Q.qZ.prototype
+C.oA=T.ov.prototype
 C.Mh=A.kn.prototype
 C.FH=U.fI.prototype
 C.SX=R.zM.prototype
 C.ZJ=D.Rk.prototype
-C.th=U.Ti.prototype
+C.Ns=U.Ti.prototype
 C.wU=Q.xI.prototype
 C.Yo=Q.CY.prototype
 C.dX=K.nm.prototype
 C.wB=X.uw.prototype
 C.lx=A.G1.prototype
-C.vB=J.zH.prototype
+C.vB=J.kdQ.prototype
 C.u2=X.I5.prototype
-C.nt=U.el.prototype
+C.bV=U.el.prototype
 C.KZ=new H.hJ()
 C.x4=new U.WH()
 C.Gw=new H.Xc()
-C.Eq=new P.vG()
-C.Wj=new P.JF()
+C.Eq=new P.qn()
+C.ZB=new P.JF()
 C.pr=new P.mgb()
 C.dV=new L.iNc()
 C.NU=new P.R81()
-C.WA=new D.WAE("Collected")
+C.v8=new P.AH()
+C.wV=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
@@ -16760,15 +17548,15 @@
 C.YT=new H.GD("expr")
 C.HH=H.IL('dynamic')
 C.NS=new K.vly()
-C.px=new A.yL()
+C.px=new A.A2()
 I.ko=function(a){a.immutable$list=init
 a.fixed$length=init
 return a}
 C.XVh=I.ko([C.NS,C.px])
 C.V0=new A.ES(C.YT,C.BM,!1,C.HH,!1,C.XVh)
 C.rB=new H.GD("isolate")
-C.Ug=H.IL('bv')
-C.ZQ=new A.ES(C.rB,C.BM,!1,C.Ug,!1,C.XVh)
+C.Ks=H.IL('bv')
+C.ZQ=new A.ES(C.rB,C.BM,!1,C.Ks,!1,C.XVh)
 C.Ms=new H.GD("iconClass")
 C.Db=H.IL('qU')
 C.mI=new K.ndx()
@@ -16778,14 +17566,14 @@
 C.BQ=H.IL('a2')
 C.m8=new A.ES(C.VK,C.BM,!1,C.BQ,!1,C.XVh)
 C.EV=new H.GD("library")
-C.Sk=H.IL('U4')
-C.Ei=new A.ES(C.EV,C.BM,!1,C.Sk,!1,C.XVh)
+C.Jny=H.IL('U4')
+C.Ei=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.XVh)
 C.zU=new H.GD("uncheckedText")
 C.IK=new A.ES(C.zU,C.BM,!1,C.Db,!1,C.XVh)
 C.UL=new H.GD("profileChanged")
-C.yQ=H.IL('EH')
+C.dg=H.IL('EH')
 C.xD=I.ko([])
-C.mM=new A.ES(C.UL,C.it,!1,C.yQ,!1,C.xD)
+C.mM=new A.ES(C.UL,C.it,!1,C.dg,!1,C.xD)
 C.Ql=new H.GD("hasClass")
 C.TJ=new A.ES(C.Ql,C.BM,!1,C.BQ,!1,C.y0)
 C.B0=new H.GD("expand")
@@ -16793,7 +17581,7 @@
 C.kV=new H.GD("link")
 C.Os=new A.ES(C.kV,C.BM,!1,C.Db,!1,C.XVh)
 C.Wm=new H.GD("refChanged")
-C.QW=new A.ES(C.Wm,C.it,!1,C.yQ,!1,C.xD)
+C.QW=new A.ES(C.Wm,C.it,!1,C.dg,!1,C.xD)
 C.SA=new H.GD("lines")
 C.hAX=H.IL('WO')
 C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.y0)
@@ -16810,9 +17598,11 @@
 C.uk=new H.GD("last")
 C.Mq=new A.ES(C.uk,C.BM,!1,C.BQ,!1,C.XVh)
 C.bz=new H.GD("isolateChanged")
-C.Bk=new A.ES(C.bz,C.it,!1,C.yQ,!1,C.xD)
+C.Bk=new A.ES(C.bz,C.it,!1,C.dg,!1,C.xD)
 C.CG=new H.GD("posChanged")
-C.Ml=new A.ES(C.CG,C.it,!1,C.yQ,!1,C.xD)
+C.Ml=new A.ES(C.CG,C.it,!1,C.dg,!1,C.xD)
+C.Mc=new H.GD("flagList")
+C.XV=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.XVh)
 C.QH=new H.GD("fragmentation")
 C.kt=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.XVh)
 C.td=new H.GD("object")
@@ -16842,20 +17632,22 @@
 C.mr=new H.GD("expanded")
 C.DC=new A.ES(C.mr,C.BM,!1,C.BQ,!1,C.y0)
 C.j2=new H.GD("app")
-C.PS=H.IL('mL')
-C.zJ=new A.ES(C.j2,C.BM,!1,C.PS,!1,C.XVh)
+C.oP=H.IL('mL')
+C.zJ=new A.ES(C.j2,C.BM,!1,C.oP,!1,C.XVh)
 C.xP=new H.GD("ref")
 C.hI=new A.ES(C.xP,C.BM,!1,C.SmN,!1,C.XVh)
+C.jU=new H.GD("file")
+C.v0=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.XVh)
 C.qs=new H.GD("io")
 C.ly=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.XVh)
 C.qX=new H.GD("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.it,!1,C.yQ,!1,C.xD)
+C.dO=new A.ES(C.qX,C.it,!1,C.dg,!1,C.xD)
 C.i0=new H.GD("coverageChanged")
-C.GH=new A.ES(C.i0,C.it,!1,C.yQ,!1,C.xD)
+C.GH=new A.ES(C.i0,C.it,!1,C.dg,!1,C.xD)
 C.pO=new H.GD("functionChanged")
-C.au=new A.ES(C.pO,C.it,!1,C.yQ,!1,C.xD)
+C.au=new A.ES(C.pO,C.it,!1,C.dg,!1,C.xD)
 C.rP=new H.GD("mapChanged")
-C.Nt=new A.ES(C.rP,C.it,!1,C.yQ,!1,C.xD)
+C.Nt=new A.ES(C.rP,C.it,!1,C.dg,!1,C.xD)
 C.aP=new H.GD("active")
 C.xO=new A.ES(C.aP,C.BM,!1,C.BQ,!1,C.XVh)
 C.WQ=new H.GD("field")
@@ -16863,8 +17655,8 @@
 C.YD=new H.GD("sampleRate")
 C.fP=new A.ES(C.YD,C.BM,!1,C.Db,!1,C.y0)
 C.Aa=new H.GD("results")
-C.va=H.IL('wn')
-C.Uz=new A.ES(C.Aa,C.BM,!1,C.va,!1,C.y0)
+C.Gu=H.IL('wn')
+C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gu,!1,C.y0)
 C.t6=new H.GD("mapAsString")
 C.b6=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.y0)
 C.hf=new H.GD("label")
@@ -16872,24 +17664,28 @@
 C.UY=new H.GD("result")
 C.rT=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.XVh)
 C.PX=new H.GD("script")
-C.qn=H.IL('vx')
-C.Cj=new A.ES(C.PX,C.BM,!1,C.qn,!1,C.XVh)
+C.KB=H.IL('vx')
+C.Cj=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.XVh)
 C.S4=new H.GD("busy")
 C.FB=new A.ES(C.S4,C.BM,!1,C.BQ,!1,C.y0)
 C.AO=new H.GD("qualifiedName")
 C.UE=new A.ES(C.AO,C.BM,!1,C.Db,!1,C.XVh)
+C.OO=new H.GD("flag")
+C.RM=new A.ES(C.OO,C.BM,!1,C.jJ,!1,C.XVh)
 C.eh=new H.GD("lineMode")
 C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.y0)
 C.XA=new H.GD("cls")
 C.CO=new A.ES(C.XA,C.BM,!1,C.MR1,!1,C.XVh)
+C.fV=new H.GD("small")
+C.CN=new A.ES(C.fV,C.BM,!1,C.BQ,!1,C.XVh)
 C.AV=new H.GD("callback")
 C.h1=new A.ES(C.AV,C.BM,!1,C.HH,!1,C.XVh)
 C.PM=new H.GD("status")
 C.jv=new A.ES(C.PM,C.BM,!1,C.Db,!1,C.y0)
 C.kz=new H.GD("showCoverageChanged")
-C.db=new A.ES(C.kz,C.it,!1,C.yQ,!1,C.xD)
+C.db=new A.ES(C.kz,C.it,!1,C.dg,!1,C.xD)
 C.ox=new H.GD("countersChanged")
-C.Rh=new A.ES(C.ox,C.it,!1,C.yQ,!1,C.xD)
+C.Rh=new A.ES(C.ox,C.it,!1,C.dg,!1,C.xD)
 C.bk=new H.GD("checked")
 C.Nu=new A.ES(C.bk,C.BM,!1,C.BQ,!1,C.XVh)
 C.bE=new H.GD("sampleDepth")
@@ -16904,7 +17700,7 @@
 C.wu=H.IL('Sa')
 C.ti=new A.ES(C.AV,C.BM,!1,C.wu,!1,C.XVh)
 C.N8=new H.GD("scriptChanged")
-C.qE=new A.ES(C.N8,C.it,!1,C.yQ,!1,C.xD)
+C.qE=new A.ES(C.N8,C.it,!1,C.dg,!1,C.xD)
 C.UX=new H.GD("msg")
 C.X4=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.XVh)
 C.rE=new H.GD("frame")
@@ -16912,10 +17708,10 @@
 C.ak=new H.GD("hasParent")
 C.yI=new A.ES(C.ak,C.BM,!1,C.BQ,!1,C.y0)
 C.xS=new H.GD("tagSelectorChanged")
-C.bw=new A.ES(C.xS,C.it,!1,C.yQ,!1,C.xD)
+C.bw=new A.ES(C.xS,C.it,!1,C.dg,!1,C.xD)
 C.kG=new H.GD("classTable")
-C.jt=H.IL('Vz')
-C.dh=new A.ES(C.kG,C.BM,!1,C.jt,!1,C.y0)
+C.HjP=H.IL('Vz')
+C.dh=new A.ES(C.kG,C.BM,!1,C.HjP,!1,C.y0)
 C.Dj=new H.GD("refreshTime")
 C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.y0)
 C.i4=new H.GD("code")
@@ -16927,11 +17723,16 @@
 C.eq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.XVh)
 C.a0=new H.GD("isDart")
 C.P9=new A.ES(C.a0,C.BM,!1,C.BQ,!1,C.y0)
+C.Ve=new H.GD("socket")
+C.Xmq=H.IL('WP')
+C.Gg=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.XVh)
 C.Gn=new H.GD("objectChanged")
-C.az=new A.ES(C.Gn,C.it,!1,C.yQ,!1,C.xD)
+C.az=new A.ES(C.Gn,C.it,!1,C.dg,!1,C.xD)
 C.ne=new H.GD("exception")
 C.SNu=H.IL('EP')
 C.l6=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.XVh)
+C.Wj=new H.GD("process")
+C.FN=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.XVh)
 C.QK=new H.GD("qualified")
 C.VQ=new A.ES(C.QK,C.BM,!1,C.BQ,!1,C.XVh)
 C.yh=new H.GD("error")
@@ -16940,13 +17741,15 @@
 C.oUD=H.IL('N7')
 C.xQ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.XVh)
 C.r1=new H.GD("expandChanged")
-C.nP=new A.ES(C.r1,C.it,!1,C.yQ,!1,C.xD)
+C.nP=new A.ES(C.r1,C.it,!1,C.dg,!1,C.xD)
 C.XY=new H.GD("showCoverage")
 C.ec=new A.ES(C.XY,C.BM,!1,C.BQ,!1,C.XVh)
 C.Lc=new H.GD("kind")
 C.Tt=new A.ES(C.Lc,C.BM,!1,C.Db,!1,C.XVh)
-C.ngm=I.ko([C.mI])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.nq,!1,C.ngm)
+C.YE=new H.GD("webSocket")
+C.Xt=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.XVh)
+C.ng=I.ko([C.mI])
+C.Qs=new A.ES(C.i4,C.BM,!0,C.nq,!1,C.ng)
 C.lH=new H.GD("checkedText")
 C.A5=new A.ES(C.lH,C.BM,!1,C.Db,!1,C.XVh)
 C.GE=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.XVh)
@@ -16958,17 +17761,17 @@
 C.K9=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.XVh)
 C.PI=new H.GD("displayValue")
 C.lg=new A.ES(C.PI,C.BM,!1,C.Db,!1,C.y0)
-C.RT=new P.a6(0)
-C.mt=H.VM(new W.pq("change"),[W.ea])
-C.nI=H.VM(new W.pq("click"),[W.Oq])
-C.MD=H.VM(new W.pq("error"),[W.ew])
-C.yZ=H.VM(new W.pq("hashchange"),[W.ea])
-C.i3=H.VM(new W.pq("input"),[W.ea])
-C.LF=H.VM(new W.pq("load"),[W.ew])
-C.ph=H.VM(new W.pq("message"),[W.AW])
-C.uh=H.VM(new W.pq("mousedown"),[W.Oq])
-C.Kq=H.VM(new W.pq("mousemove"),[W.Oq])
-C.JS=function(hooks) {
+C.ny=new P.a6(0)
+C.U3=H.VM(new W.FkO("change"),[W.ea])
+C.nI=H.VM(new W.FkO("click"),[W.Oq])
+C.MD=H.VM(new W.FkO("error"),[W.kQ])
+C.yZ=H.VM(new W.FkO("hashchange"),[W.ea])
+C.i3=H.VM(new W.FkO("input"),[W.ea])
+C.LF=H.VM(new W.FkO("load"),[W.kQ])
+C.ph=H.VM(new W.FkO("message"),[W.AW])
+C.uh=H.VM(new W.FkO("mousedown"),[W.Oq])
+C.Kq=H.VM(new W.FkO("mousemove"),[W.Oq])
+C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
 }
@@ -17099,20 +17902,20 @@
   hooks.getTag = getTagFixed;
   hooks.prototypeForTag = prototypeForTagFixed;
 }
-C.zc=new P.D4(null,null)
+C.xr=new P.D4(null,null)
 C.A3=new P.Cf(null)
-C.Sr=new P.dI(null,null)
+C.Sr=new P.ze(null,null)
 C.Ab=new N.qV("FINER",400)
-C.eI=new N.qV("FINE",500)
+C.t4=new N.qV("FINE",500)
 C.IF=new N.qV("INFO",800)
 C.Xm=new N.qV("SEVERE",1000)
 C.nT=new N.qV("WARNING",900)
-C.Yy=new H.GD("keys")
+C.SV=new H.GD("keys")
 C.Yn=new H.GD("values")
 C.Wn=new H.GD("length")
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
-C.WK=I.ko([C.Yy,C.Yn,C.Wn,C.ai,C.nZ])
+C.WK=I.ko([C.SV,C.Yn,C.Wn,C.ai,C.nZ])
 C.yD=I.ko([0,0,26498,1023,65534,34815,65534,18431])
 C.G8=I.ko(["==","!=","<=",">=","||","&&"])
 C.Cd=I.ko(["in","this"])
@@ -17120,26 +17923,30 @@
 C.bg=I.ko([43,45,42,47,33,38,37,60,61,62,63,94,124])
 C.ML=I.ko([40,41,91,93,123,125])
 C.zao=I.ko(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.uE=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
+C.z5=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
 C.p5=I.ko(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.Mk=new H.Px(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.paX=I.ko(["name","extends","constructor","noscript","attributes"])
 C.kr=new H.Px(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.CM=new H.Px(0,{},C.xD)
-C.MB=I.ko(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.SP=new H.Px(17,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.MB)
+C.V0I=I.ko(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
+C.SP=new H.Px(17,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.V0I)
 C.MEG=I.ko(["enumerate"])
 C.eu=new H.Px(1,{enumerate:K.G5()},C.MEG)
 C.tq=H.IL('Bo')
-C.MS=H.IL('wA')
-C.wE=I.ko([C.MS])
+C.uwj=H.IL('wA')
+C.wE=I.ko([C.uwj])
 C.Xk=new A.Wq(!1,!1,!0,C.tq,!1,!0,C.wE,null)
-C.wVi=H.IL('yL')
-C.bt=I.ko([C.wVi])
-C.YV=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.bt,null)
+C.BzF=H.IL('A2')
+C.RNu=I.ko([C.BzF])
+C.Hh=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.RNu,null)
+C.wj=new D.l8R("Internal")
+C.Cn=new D.l8R("Listening")
+C.qp=new D.l8R("Normal")
+C.FJ=new D.l8R("Pipe")
 C.IH=new H.GD("address")
 C.US=new H.GD("architecture")
-C.Za=new H.GD("args")
+C.Zg=new H.GD("args")
 C.ET=new H.GD("assertsEnabled")
 C.WC=new H.GD("bpt")
 C.Ro=new H.GD("buttonClick")
@@ -17147,6 +17954,7 @@
 C.C0=new H.GD("change")
 C.eZ=new H.GD("changeSort")
 C.OI=new H.GD("classes")
+C.To=new H.GD("closing")
 C.qt=new H.GD("coloring")
 C.p1=new H.GD("columns")
 C.M8=new H.GD("currentHash")
@@ -17159,6 +17967,7 @@
 C.u7=new H.GD("evalNow")
 C.Ek=new H.GD("expander")
 C.Pn=new H.GD("expanderStyle")
+C.R3=new H.GD("fd")
 C.Gd=new H.GD("firstTokenPos")
 C.FP=new H.GD("formatSize")
 C.kF=new H.GD("formatTime")
@@ -17200,6 +18009,7 @@
 C.tD=new H.GD("isList")
 C.Of=new H.GD("isNull")
 C.pY=new H.GD("isOptimized")
+C.LA=new H.GD("isPipe")
 C.Lk=new H.GD("isString")
 C.dK=new H.GD("isType")
 C.xf=new H.GD("isUnexpected")
@@ -17209,7 +18019,10 @@
 C.ur=new H.GD("lib")
 C.VN=new H.GD("libraries")
 C.VI=new H.GD("line")
+C.cc=new H.GD("listening")
 C.DY=new H.GD("loading")
+C.Lx=new H.GD("localAddress")
+C.M3=new H.GD("localPort")
 C.wT=new H.GD("mainPort")
 C.pX=new H.GD("message")
 C.VD=new H.GD("mouseOut")
@@ -17225,11 +18038,15 @@
 C.zm=new H.GD("padding")
 C.Ic=new H.GD("pause")
 C.yG=new H.GD("pauseEvent")
+C.AY=new H.GD("protocol")
+C.I7=new H.GD("readClosed")
 C.GR=new H.GD("refresh")
 C.KX=new H.GD("refreshCoverage")
 C.ja=new H.GD("refreshGC")
 C.MT=new H.GD("registerCallback")
 C.Gi=new H.GD("relativeHashLink")
+C.yL=new H.GD("remoteAddress")
+C.ni=new H.GD("remotePort")
 C.X2=new H.GD("resetAccumulator")
 C.F3=new H.GD("response")
 C.nY=new H.GD("resume")
@@ -17242,8 +18059,9 @@
 C.EA=new H.GD("scripts")
 C.oW=new H.GD("selectExpr")
 C.hd=new H.GD("serviceType")
+C.jM=new H.GD("socketOwner")
 C.DW=new H.GD("sortedRows")
-C.R3=new H.GD("stacktrace")
+C.Pf=new H.GD("stacktrace")
 C.Nv=new H.GD("subclass")
 C.hO=new H.GD("tipExclusive")
 C.ei=new H.GD("tipKind")
@@ -17261,34 +18079,45 @@
 C.mh=new H.GD("uptime")
 C.Fh=new H.GD("url")
 C.jh=new H.GD("v")
-C.YI=new H.GD("value")
+C.zdr=new H.GD("value")
+C.fj=new H.GD("variable")
 C.xw=new H.GD("variables")
 C.zn=new H.GD("version")
 C.Tc=new H.GD("vmName")
+C.Uy=new H.GD("writeClosed")
 C.k5=H.IL('hx')
+C.hP=H.IL('uz')
+C.KS=H.IL('oD')
 C.Mf=H.IL('G1')
-C.cI=H.IL('Dg')
+C.q0S=H.IL('Dg')
 C.Dl=H.IL('F1')
+C.Jf=H.IL('Mb')
 C.UJ=H.IL('oa')
 C.E0=H.IL('aI')
 C.Y3=H.IL('CY')
 C.kq=H.IL('Nn')
 C.j4=H.IL('IW')
+C.Vx=H.IL('MJ')
 C.Vh=H.IL('qZ')
 C.dH=H.IL('Pz')
 C.HC=H.IL('F0')
+C.rR=H.IL('wN')
 C.yS=H.IL('G6')
+C.z7=H.IL('YA')
 C.Sb=H.IL('kn')
 C.FQ=H.IL('a')
 C.Yc=H.IL('iP')
+C.EZ=H.IL('oF')
 C.vw=H.IL('UK')
 C.Jo=H.IL('i7')
+C.BL=H.IL('Nr')
+C.ON=H.IL('ov')
 C.jR=H.IL('Be')
 C.al=H.IL('es')
 C.PT=H.IL('CX')
 C.iD=H.IL('Vb')
-C.Zt=H.IL('Uy')
 C.ce=H.IL('kK')
+C.dD=H.IL('av')
 C.FA=H.IL('Ya')
 C.T1=H.IL('Wy')
 C.hG=H.IL('ir')
@@ -17303,10 +18132,13 @@
 C.CR=H.IL('CP')
 C.xE=H.IL('aC')
 C.vu=H.IL('uw')
+C.pJ=H.IL('Q6')
+C.Yy=H.IL('uE')
 C.Yxm=H.IL('Pg')
 C.il=H.IL('xI')
 C.G0=H.IL('mJ')
 C.lp=H.IL('LU')
+C.oG=H.IL('ds')
 C.TU=H.IL('Oz')
 C.OG=H.IL('eW')
 C.oZ=H.IL('HS')
@@ -17319,17 +18151,20 @@
 C.l4=H.IL('uL')
 C.Wh=H.IL('U1')
 C.Zj=H.IL('md')
-C.KA=H.IL('X6')
+C.FG=H.IL('qh')
 C.YZ=H.IL('zt')
 C.NR=H.IL('nm')
+C.DD=H.IL('Zn')
 C.qF=H.IL('mO')
 C.Ey=H.IL('wM')
 C.nX=H.IL('DE')
 C.bh=H.IL('i6')
 C.jRi=H.IL('we')
+C.Xv=H.IL('n5')
 C.KO=H.IL('ZP')
-C.BV=H.IL('Mc')
 C.Wz=H.IL('pR')
+C.Ep=H.IL('ou')
+C.tc=H.IL('Ma')
 C.Io=H.IL('Qh')
 C.wk=H.IL('nJ')
 C.te=H.IL('BS')
@@ -17348,14 +18183,14 @@
 C.XW=H.IL('uEY')
 C.oT=H.IL('VY')
 C.jK=H.IL('el')
-C.xM=new P.Fd(!1)
+C.xM=new P.u5F(!1)
 $.libraries_to_load = {}
-$.z7="$cachedFunction"
+$.H9="$cachedFunction"
 $.eb="$cachedInvocation"
 $.OK=0
 $.bf=null
 $.P4=null
-$.UA=!1
+$.lcs=!1
 $.NF=null
 $.TX=null
 $.x7=null
@@ -17363,13 +18198,13 @@
 $.vv=null
 $.Bv=null
 $.BY=null
-$.oKB=null
+$.oK=null
 $.S6=null
 $.k8=null
 $.X3=C.NU
 $.Ss=0
 $.Qz=null
-$.PN=null
+$.R6=null
 $.RL=!1
 $.Y4=C.IF
 $.Y1=0
@@ -17380,9 +18215,12 @@
 $.xG=null
 $.Bh=0
 $.ok=!1
+$.AC=!1
+$.M6=null
+$.UG=!0
 $.RQ="objects/"
-$.To=null
-$.Au=[C.tq,W.Bo,{},C.k5,Z.hx,{created:Z.BN},C.Mf,A.G1,{created:A.J8},C.cI,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.VO},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Al},C.j4,D.IW,{created:D.dm},C.Vh,Q.qZ,{created:Q.RH},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.D2},C.vw,A.UK,{created:A.JT},C.Jo,D.i7,{created:D.dq},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.Zt,T.Uy,{created:T.Zz},C.ce,X.kK,{created:X.os},C.FA,A.Ya,{created:A.JR},C.hG,A.ir,{created:A.G7},C.Th,U.fI,{created:U.UF},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.cF},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.zB},C.vu,X.uw,{created:X.bV},C.Yxm,H.Pg,{"":H.KY},C.il,Q.xI,{created:Q.lK},C.lp,R.LU,{created:R.rA},C.TU,D.Oz,{created:D.RP},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.Wh,E.U1,{created:E.hm},C.Zj,A.md,{created:A.aD},C.NR,K.nm,{created:K.an},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.nX,E.DE,{created:E.oB},C.bh,R.i6,{created:R.IT},C.jRi,H.we,{"":H.m6},C.KO,F.ZP,{created:F.Yw},C.BV,D.Mc,{created:D.BP},C.Wz,B.pR,{created:B.lu},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.yU},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.E5},C.ri,W.yy,{},C.Az,A.Gk,{created:A.Sy},C.X8,U.Ti,{created:U.lv},C.Lg,R.JI,{created:R.p7},C.Ju,K.Ly,{created:K.le},C.mq,L.qk,{created:L.KM},C.XW,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
+$.vU=null
+$.Au=[C.tq,W.Bo,{},C.k5,Z.hx,{created:Z.BN},C.hP,E.uz,{created:E.fr},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.Jf,E.Mb,{created:E.pD},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Al},C.j4,D.IW,{created:D.dm},C.Vx,X.MJ,{created:X.Bs},C.Vh,Q.qZ,{created:Q.RH},C.rR,E.wN,{created:E.wZ7},C.yS,B.G6,{created:B.KU},C.z7,D.YA,{created:D.BP},C.Sb,A.kn,{created:A.D2},C.EZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.JT},C.Jo,D.i7,{created:D.qb},C.BL,X.Nr,{created:X.na},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.os},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.JR},C.hG,A.ir,{created:A.G7},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.cF},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.zg},C.vu,X.uw,{created:X.HI},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.eg},C.Yxm,H.Pg,{"":H.KY},C.il,Q.xI,{created:Q.lK},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pI},C.TU,D.Oz,{created:D.RP},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.zf},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.Wh,E.U1,{created:E.hm},C.Zj,A.md,{created:A.DCi},C.FG,E.qh,{created:E.Sc},C.NR,K.nm,{created:K.qa},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.nX,E.DE,{created:E.oB},C.bh,R.i6,{created:R.IT},C.jRi,H.we,{"":H.ic},C.Xv,E.n5,{created:E.xx},C.KO,F.ZP,{created:F.Yw},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.dv},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.N0},C.ms,A.Bm,{created:A.yU},C.pK,D.Rk,{created:D.dP},C.lE,U.DK,{created:U.E5},C.ri,W.yy,{},C.Az,A.Gk,{created:A.Sy},C.X8,U.Ti,{created:U.lv},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.KM},C.XW,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
 I.$lazy($,"globalWindow","UW","My",function(){return $.jk().window})
 I.$lazy($,"globalWorker","uj","nB",function(){return $.jk().Worker})
@@ -17394,7 +18232,7 @@
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.cM(H.S7(null))})
 I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())})
-I.$lazy($,"undefinedCallPattern","GK","LC",function(){return H.cM(H.S7(void 0))})
+I.$lazy($,"undefinedCallPattern","qi","rx",function(){return H.cM(H.S7(void 0))})
 I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{(void 0).$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"nullPropertyPattern","BX","W6",function(){return H.cM(H.Mj(null))})
@@ -17402,22 +18240,21 @@
 I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.cM(H.Mj(void 0))})
 I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.cM(function(){try{(void 0).$method$}catch(z){return z.message}}())})
 I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_toStringList","mC","ng",function(){return[]})
-I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.C2()})
-I.$lazy($,"_toStringVisiting","xg","xb",function(){return P.yv(null)})
+I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
+I.$lazy($,"_toStringVisiting","nM","Ex",function(){return P.yv(null)})
 I.$lazy($,"_toStringList","yu","tw",function(){return[]})
-I.$lazy($,"webkitEvents","xW","Z2",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
+I.$lazy($,"webkitEvents","Ha","PO",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
 I.$lazy($,"context","Lt","ca",function(){return P.ND(function(){return this}())})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
-I.$lazy($,"_freeColor","nK","aw",function(){return[255,255,255,255]})
+I.$lazy($,"_freeColor","nK","Rl",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","fM","Sd",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","Uj","R2",function(){return P.Fl(P.qU,N.JM)})
-I.$lazy($,"_logger","jz","T5",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","qa","C4",function(){return new L.vH([])})
+I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.Rw)})
+I.$lazy($,"_logger","y7","eI",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_instance","qr","V6",function(){return new L.Ul([])})
 I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.MdQ().$0()})
-I.$lazy($,"_logger","y7","Ku",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_logger","jz","T5",function(){return N.QM("observe.PathObserver")})
 I.$lazy($,"_pathCache","zC","fX",function(){return P.L5(null,null,null,P.qU,L.Tv)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
 I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
@@ -17427,32 +18264,32 @@
 I.$lazy($,"_reverseEventTranslations","fp","pT",function(){return new A.DOe().$0()})
 I.$lazy($,"_ATTRIBUTES_REGEX","vg","zZ",function(){return new H.VR("\\s|,",H.ol("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.ol("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,P.qU,P.a)
+I.$lazy($,"_polymerSyntax","Df","XZ",function(){var z=P.L5(null,null,null,P.qU,P.a)
 z.FV(0,C.eu)
 return new A.N9(z)})
 I.$lazy($,"_ready","T6","ln",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_observeLog","DZ","dn",function(){return N.QM("polymer.observe")})
 I.$lazy($,"_eventsLog","mf","Uk",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","fV","RI",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","Q6","ZH",function(){return N.QM("polymer.bind")})
-I.$lazy($,"_shadowHost","v8","RV",function(){return H.VM(new P.kM(null),[A.dM])})
+I.$lazy($,"_unbindLog","pH","EM",function(){return N.QM("polymer.unbind")})
+I.$lazy($,"_bindLog","f2","zB",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_shadowHost","zr","c7",function(){return H.VM(new P.kM(null),[A.dM])})
 I.$lazy($,"_typeHandlers","lq","QL",function(){return P.EF([C.Db,new Z.Md(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.BQ,new Z.Ra(),C.yw,new Z.wJY(),C.CR,new Z.zOQ()],null,null)})
 I.$lazy($,"_BINARY_OPERATORS","Af","Jl",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"*",new K.Raa(),"/",new K.w0(),"==",new K.w5(),"!=",new K.w10(),">",new K.w11(),">=",new K.w12(),"<",new K.w13(),"<=",new K.w14(),"||",new K.w15(),"&&",new K.w16(),"|",new K.w17()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.w18(),"-",new K.w19(),"!",new K.w20()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","vfp","OX",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_UNARY_OPERATORS","qM","qL",function(){return P.EF(["+",new K.w18(),"-",new K.w19(),"!",new K.w20()],null,null)})
+I.$lazy($,"_currentIsolateMatcher","cZ","Dw",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
 I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.ol("isolates/\\d+/",!1,!0,!1),null,null)})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
 I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","b7",function(){return D.kP()})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.YJG().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_ownerStagingDocument","EW","Lu",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.W6o()).zV(0,", ")})
+I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
+I.$lazy($,"_allTemplatesSelectors","Qn","i8",function(){return"template, "+J.kl(C.z5.gvc(),new M.W6o()).zV(0,", ")})
 I.$lazy($,"_templateCreator","H8","rf",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.kM("template_binding"),[null])})
 
-init.functionAliases={Sa:163}
-init.metadata=["sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"b1",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"Ib",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.Ij,P.Ij]},{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"DZ",ret:P.KN,args:[P.a]},{func:"aB",args:[null]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","callback","captureThis","self","arguments","o",{func:"ZD",ret:P.a2,args:[P.IN]},"symbol",{func:"qq",ret:[P.cX,K.O1],args:[P.cX]},"iterable","invocation","f",{func:"NT"},{func:"ob",args:[P.EH]},"code",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception","event","obj",{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"c3",args:[P.KN,P.KN]},"done",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail","target",{func:"Aw",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.mE]},{func:"BG",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},"_",{func:"Cm",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"aR",void:true,args:[null,P.mE]},"arg","each",{func:"lv",args:[P.IN,null]},{func:"jK",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},"xhr",{func:"QO",void:true,args:[W.Oq]},"result",{func:"fK",args:[D.af]},{func:"XG",ret:O.Hz},"response",{func:"Q5",args:[D.vO]},"st",{func:"Sz",void:true,args:[W.ea,null,W.h4]},{func:"xo",ret:P.qU,args:[P.a2]},"newSpace",{func:"vO",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.cX,args:[{func:"pL",args:[P.qU]}]},{func:"Qd",ret:P.cX,args:[{func:"uW",ret:P.cX,args:[P.qU]}]},{func:"S0",void:true,args:[P.a2,null]},"expand",{func:"KDY",ret:[P.b8,D.af],args:[null]},{func:"Df",ret:P.qU,args:[G.Y2]},"m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile",{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type","s",{func:"DF",void:true,args:[P.a]},"records",{func:"kk",args:[L.Tv,null]},{func:"qx",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"WW",void:true,args:[W.ea]},"i","changes","model","node","oneTime",{func:"cq",args:[null,null,null]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},"k","v",{func:"oe",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.hw,U.hw]},{func:"qo",args:[U.hw]},{func:"Yg",ret:P.qU,args:[D.c2]},"line","map",{func:"JC",args:[V.qC]},{func:"If",ret:P.qU,args:[P.qU]},"id",{func:"rl",ret:P.b8},{func:"a0",void:true,args:[D.vO]},"coverage","scriptCoverage","timer",{func:"I0",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func","msg","details","x",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"vl",ret:[P.b8,V.qC],args:[P.qU]},];$=null
+init.functionAliases={Sa:183}
+init.metadata=["sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"cX",void:true,args:[P.xp,P.qK,P.xp,null,P.mE]},"self","parent","zone",{func:"QN",args:[P.xp,P.qK,P.xp,{func:"NT"}]},"f",{func:"wD",args:[P.xp,P.qK,P.xp,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.xp,P.qK,P.xp,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.xp,P.qK,P.xp,{func:"NT"}]},{func:"ie",ret:{func:"aB",args:[null]},args:[P.xp,P.qK,P.xp,{func:"aB",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.xp,P.qK,P.xp,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.xp,P.qK,P.xp,{func:"NT"}]},{func:"Uk",ret:P.Xa,args:[P.xp,P.qK,P.xp,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.xp,P.qK,P.xp,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Jj",ret:P.xp,args:[P.xp,P.qK,P.xp,P.aY,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"Z5",ret:P.a2,args:[P.IN]},"symbol",{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable","invocation",{func:"NT"},{func:"ob",args:[P.EH]},"code",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception","event","obj",{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"c3",args:[P.KN,P.KN]},"done",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail","target",{func:"lQ",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.mE]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"SF",args:[P.a2]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"N5",void:true,args:[null,P.mE]},"each",{func:"lv",args:[P.IN,null]},{func:"jK",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},"xhr",{func:"QO",void:true,args:[W.Oq]},"result",{func:"jH",args:[D.af]},{func:"XG",ret:O.Hz},"response",{func:"Q5",args:[D.vO]},"st",{func:"Sz",void:true,args:[W.ea,null,W.h4]},{func:"xo",ret:P.qU,args:[P.a2]},"newSpace",{func:"rI",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[P.qU]}]},{func:"pw",void:true,args:[P.a2,null]},"expand",{func:"KDY",ret:[P.b8,D.af],args:[null]},{func:"Df",ret:P.qU,args:[G.Y2]},"m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.qK,P.xp]},{func:"h2",args:[P.xp,P.qK,P.xp,{func:"aB",args:[null]}]},"x","s",{func:"DF",void:true,args:[P.a]},"records",{func:"kk",args:[L.Tv,null]},{func:"qx",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"WW",void:true,args:[W.ea]},"i","changes","model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"K7",void:true,args:[[P.WO,T.yj]]},"jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},"k","v",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.hw,U.hw]},{func:"Qc",args:[U.hw]},{func:"Yg",ret:P.qU,args:[D.c2]},"line","map",{func:"JC",args:[V.qC]},{func:"If",ret:P.qU,args:[P.qU]},"id",{func:"rl",ret:P.b8},{func:"a0",void:true,args:[D.vO]},"coverage","scriptCoverage","timer",{func:"Br",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func","msg","details",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"vl",ret:P.b8,args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -17498,7 +18335,7 @@
 return}if(document.currentScript){a(document.currentScript)
 return}var z=document.scripts
 function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.Tb(),b)},[])}else{(function(b){H.wW(E.Tb(),b)})([])}})
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.vS(),b)},[])}else{(function(b){H.wW(E.vS(),b)})([])}})
 function init(){I.p={}
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
index ee101d2..c104893 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
@@ -14,6 +14,7 @@
   <link rel="import" href="src/elements/eval_link.html">
   <link rel="import" href="src/elements/field_ref.html">
   <link rel="import" href="src/elements/field_view.html">
+  <link rel="import" href="src/elements/flag_list.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">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html
index fa691cb..7c1974f 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html
@@ -22,5 +22,5 @@
     </template>
 
   </template>
-  <script type="application/dart;component=1" src="action_link.dart"></script>
+  <script type="application/dart" src="action_link.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
index 3fbb4c0..564dad4 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
@@ -26,5 +26,5 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart;component=1" src="breakpoint_list.dart"></script>
+  <script type="application/dart" src="breakpoint_list.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
index 043ecce..0b595f6 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
@@ -5,5 +5,5 @@
 
 <template><link rel="stylesheet" href="css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
-<script type="application/dart;component=1" src="class_ref.dart"></script>
+<script type="application/dart" src="class_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
index 79ccf65..7548085 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
@@ -147,5 +147,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart;component=1" src="class_view.dart"></script>
+  <script type="application/dart" src="class_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
index f18b3ca..e14384c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
@@ -16,5 +16,5 @@
       <span>{{ name }}</span>
     </template>
   </template>
-<script type="application/dart;component=1" src="code_ref.dart"></script>
+<script type="application/dart" src="code_ref.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
index a40131f..f04fd06 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
@@ -162,5 +162,5 @@
       </template>
     </div>
   </template>
-  <script type="application/dart;component=1" src="code_view.dart"></script>
+  <script type="application/dart" src="code_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/collapsible_content.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/collapsible_content.html
index 2e2f371..035e312 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/collapsible_content.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/collapsible_content.html
@@ -13,5 +13,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="collapsible_content.dart"></script>
+  <script type="application/dart" src="collapsible_content.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
index 06f2c11..2806d6d 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css
@@ -56,7 +56,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -224,3 +229,7 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/curly_block.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/curly_block.html
index 16f3270..d105267 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/curly_block.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/curly_block.html
@@ -36,5 +36,5 @@
       </template>
     </template>
   </template>
-  <script type="application/dart;component=1" src="curly_block.dart"></script>
+  <script type="application/dart" src="curly_block.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
index 9f5de00..ba54e66 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
@@ -14,5 +14,5 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="error_view.dart"></script>
+  <script type="application/dart" src="error_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
index add16d3..7d4d50b 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
@@ -83,4 +83,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart;component=1" src="eval_box.dart"></script>
+<script type="application/dart" src="eval_box.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html
index dcc7746..729698e 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html
@@ -25,5 +25,5 @@
     </template>
 
   </template>
-  <script type="application/dart;component=1" src="eval_link.dart"></script>
+  <script type="application/dart" src="eval_link.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
index ebf0a1e..6de1a19 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
@@ -20,5 +20,5 @@
       <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
     </div>
   </template>
-  <script type="application/dart;component=1" src="field_ref.dart"></script>
+  <script type="application/dart" src="field_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
index ead150d..5673bbf 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
@@ -90,5 +90,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="field_view.dart"></script>
+  <script type="application/dart" src="field_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/flag_list.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/flag_list.html
new file mode 100644
index 0000000..cabdd91
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/flag_list.html
@@ -0,0 +1,55 @@
+<head>
+  <link rel="import" href="nav_bar.html">
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="stack_frame.html">
+</head>
+
+<polymer-element name="flag-list" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <nav-menu link="{{ flagList.isolate.relativeHashLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content-centered">
+      <template if="{{ flagList['modifiedFlags'].isNotEmpty }}">
+        <h1>Modified Flags</h1>
+        <br>
+        <template repeat="{{ flag in flagList['modifiedFlags'] }}">
+          <flag-item flag="{{ flag }}"></flag-item>
+          <br>
+        </template>
+        <hr>
+      </template>
+
+      <h1>Unmodified Flags</h1>
+      <br>
+      <template if="{{ flagList['unmodifiedFlags'].isEmpty }}">
+        <em>None</em>
+      </template>
+      <template if="{{ flagList['unmodifiedFlags'].isNotEmpty }}">
+        <template repeat="{{ flag in flagList['unmodifiedFlags'] }}">
+          <flag-item flag="{{ flag }}"></flag-item>
+          <br>
+        </template>
+      </template>
+    </div>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="flag-item" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <span style="color:#aaa">// {{ flag['comment'] }}</span>
+    <div style="padding: 3px 0">
+      <b>{{ flag['name'] }}</b>
+      &nbsp;=&nbsp;
+      {{ flag['valueAsString'] }}
+    </div>
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="flag_list.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
index e29c2b0..70e5e96 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
@@ -12,5 +12,5 @@
           </function-ref>.<!--
      --></template><a href="{{ url }}">{{ name }}</a><!--
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
-<script type="application/dart;component=1" src="function_ref.dart"></script>
+<script type="application/dart" src="function_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
index 137b065..eb5bf6b 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
@@ -115,5 +115,5 @@
 
     <br>
   </template>
-  <script type="application/dart;component=1" src="function_view.dart"></script>
+  <script type="application/dart" src="function_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
index dfe2797..9f5b556 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
@@ -35,5 +35,5 @@
     <canvas id="fragmentation" width="1px" height="1px"></canvas>
   </div>
 </template>
-<script type="application/dart;component=1" src="heap_map.dart"></script>
+<script type="application/dart" src="heap_map.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
index 4454a82..aea9cd7 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
@@ -116,5 +116,5 @@
     </table>
   </div>
 </template>
-<script type="application/dart;component=1" src="heap_profile.dart"></script>
+<script type="application/dart" src="heap_profile.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
index 6627285..943ccda 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
@@ -85,5 +85,5 @@
       </template>
     </span>
   </template>
-  <script type="application/dart;component=1" src="instance_ref.dart"></script>
+  <script type="application/dart" src="instance_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
index bdf61c8..215d670 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
@@ -182,5 +182,5 @@
 
     </template>
   </template>
-  <script type="application/dart;component=1" src="instance_view.dart"></script>
+  <script type="application/dart" src="instance_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/io_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/io_view.html
new file mode 100644
index 0000000..4343aec
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/io_view.html
@@ -0,0 +1,533 @@
+<head>
+  <link rel="import" href="nav_bar.html">
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="service_ref.html">
+</head>
+<polymer-element name="io-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>dart:io</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a>
+        </li>
+      </ul>
+
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <template if="{{ ref.serviceType == 'Socket' }}">
+      <io-socket-ref ref="{{ ref }}"></io-socket-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'HttpServer' }}">
+      <io-http-server-ref ref="{{ ref }}"></io-http-server-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'WebSocket' }}">
+      <io-web-socket-ref ref="{{ ref }}"></io-web-socket-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'Process' }}">
+      <io-process-ref ref="{{ ref }}"></io-process-ref>
+    </template>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-list-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>HttpServers</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ httpServer in list['members'] }}">
+          <li class="list-group-item">
+            <io-http-server-ref ref="{{ httpServer }}"></io-http-server-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>HttpServer</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Socket</div>
+          <div class="memberValue"><io-socket-ref ref="{{ httpServer['socket'] }}"></io-socket-ref></div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Address</div>
+          <div class="memberValue">{{ httpServer['address'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Port</div>
+          <div class="memberValue">{{ httpServer['port'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Active connections</div>
+          <div class="memberValue">{{ httpServer['active'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Idle connections</div>
+          <div class="memberValue">{{ httpServer['idle'] }}</div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-socket-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-socket-list-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Sockets</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ socket in list['members'] }}">
+          <li class="list-group-item">
+            <io-socket-ref ref="{{ socket }}"></io-socket-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-socket-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <!-- Pipe Socket -->
+      <template if="{{ socket.isPipe }}">
+        <h1>Pipe Socket</h1>
+        <div class="memberList">
+          <template if="{{ socket.socketOwner != null }}">
+            <div class="memberItem">
+              <div class="memberName">Owner</div>
+              <div class="memberValue"><io-ref ref="{{ socket.socketOwner }}"></io-ref></div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">File descriptor</div>
+            <div class="memberValue">{{ socket.fd }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Read Closed</div>
+            <div class="memberValue">{{ socket.readClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Write Closed</div>
+            <div class="memberValue">{{ socket.writeClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Closing</div>
+            <div class="memberValue">{{ socket.closing }}</div>
+          </div>
+        </div>
+      </template>
+      <!-- Network Socket -->
+      <template if="{{ !socket.isPipe }}">
+        <h1>Network Socket</h1>
+        <div class="memberList">
+          <template if="{{ socket.socketOwner != null }}">
+            <div class="memberItem">
+              <div class="memberName">Owner</div>
+              <div class="memberValue"><io-ref ref="{{ socket.socketOwner }}"></io-ref></div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">Local Address</div>
+            <div class="memberValue">{{ socket.localAddress }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Local Port</div>
+            <div class="memberValue">{{ socket.localPort }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Remote Address</div>
+            <div class="memberValue">{{ socket.remoteAddress }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Remote Port</div>
+            <div class="memberValue">{{ socket.remotePort }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">File descriptor</div>
+            <div class="memberValue">{{ socket.fd }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Read Closed</div>
+            <div class="memberValue">{{ socket.readClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Write Closed</div>
+            <div class="memberValue">{{ socket.writeClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Closing</div>
+            <div class="memberValue">{{ socket.closing }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Listening</div>
+            <div class="memberValue">{{ socket.listening }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Protocol</div>
+            <div class="memberValue">{{ socket.protocol }}</div>
+          </div>
+        </div>
+      </template>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-list-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>WebSockets</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ webSocket in list['members'] }}">
+          <li class="list-group-item">
+            <io-web-socket-ref ref="{{ webSocket }}"></io-web-socket-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>WebSocket</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Socket</div>
+          <div class="memberValue"><io-socket-ref ref="{{ webSocket['socket'] }}"></io-socket-ref></div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-list-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Random Access Files</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ file in list['members'] }}">
+          <li class="list-group-item">
+            <io-random-access-file-ref ref="{{ file }}"></io-random-access-file-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Random Access File</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Path</div>
+          <div class="memberValue">{{ file['name'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Pending Operation</div>
+          <div class="memberValue">{{ file['asyncDispatched'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">File Descriptor</div>
+          <div class="memberValue">{{ file['fd'] }}</div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-list-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Processes</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ process in list['members'] }}">
+          <li class="list-group-item">
+            <io-process-ref ref="{{ process }}"></io-process-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <template if="{{ small }}">
+      <a href="{{ url }}">{{ name }}</a>
+    </template>
+    <template if="{{ !small }}">
+      <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
+    </template>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Process</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Path</div>
+          <div class="memberValue">{{ process['name'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Pid</div>
+          <div class="memberValue">{{ process['pid'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Arguments</div>
+          <div class="memberValue">{{ process['arguments'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Started</div>
+          <div class="memberValue">{{ process['started'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Working Directory</div>
+          <div class="memberValue">{{ process['workingDirectory'] }}</div>
+        </div>
+        <template if="{{ process['stdin'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stdin</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stdin'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ process['stdout'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stdout</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stdout'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ process['stderr'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stderr</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stderr'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+      </div>
+
+      <br>
+
+      <h2>Environment</h2>
+      <div class="well">
+        <div class="monospace break-wrap">
+          <template repeat="{{ variable in process['environment'] }}">
+            {{ variable }}
+            <br>
+          </template>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="io_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
index 7975491..b15b9fc 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
@@ -186,5 +186,5 @@
       </table>
     </div>
   </template>
-  <script type="application/dart;component=1" src="isolate_profile.dart"></script>
+  <script type="application/dart" src="isolate_profile.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
index b2858d2..84e4e66 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
@@ -5,5 +5,5 @@
 <template><link rel="stylesheet" href="css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
-<script type="application/dart;component=1" src="isolate_ref.dart"></script>
+<script type="application/dart" src="isolate_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
index 8968df2..9ed1e77 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
@@ -183,4 +183,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart;component=1" src="isolate_summary.dart"></script>
+<script type="application/dart" src="isolate_summary.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
index f7ab7a8..794b50a 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
@@ -137,5 +137,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart;component=1" src="isolate_view.dart"></script>
+  <script type="application/dart" src="isolate_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html
index 100bcc3..f7e42ff 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html
@@ -7,5 +7,5 @@
     </nav-bar>
       <pre>{{ mapAsString }}</pre>
   </template>
-  <script type="application/dart;component=1" src="json_view.dart"></script>
+  <script type="application/dart" src="json_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
index 20242ba..5dbfc55 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
@@ -10,5 +10,5 @@
     <a href="{{ url }}">{{ name }}</a>
   </template>
 </template>
-<script type="application/dart;component=1" src="library_ref.dart"></script>
+<script type="application/dart" src="library_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
index f525cc2..9b4e339 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
@@ -137,5 +137,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart;component=1" src="library_view.dart"></script>
+  <script type="application/dart" src="library_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
index bac4f72..fd4f762 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
@@ -209,4 +209,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart;component=1" src="nav_bar.dart"></script>
+<script type="application/dart" src="nav_bar.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html
index 9b77f24..0d34af3 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html
@@ -6,5 +6,5 @@
   <template>
     <response-viewer app="{{ this.app }}"></response-viewer>
   </template>
-  <script type="application/dart;component=1" src="observatory_application.dart"></script>
+  <script type="application/dart" src="observatory_application.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_element.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_element.html
index c825782..8a24a8c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_element.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_element.html
@@ -1,3 +1,3 @@
 <polymer-element name="observatory-element">
-  <script type="application/dart;component=1" src="observatory_element.dart"></script>
+  <script type="application/dart" src="observatory_element.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/response_viewer.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/response_viewer.html
index 0ab71dc..230120a 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/response_viewer.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/response_viewer.html
@@ -6,5 +6,5 @@
   <template>
     <service-view object="{{ app.response }}"></service-view>
   </template>
-  <script type="application/dart;component=1" src="response_viewer.dart"></script>
+  <script type="application/dart" src="response_viewer.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html
index af4e478..e4023b4 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html
@@ -44,5 +44,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="script_inset.dart"></script>
+  <script type="application/dart" src="script_inset.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
index 9f4445c..07f27f2 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
@@ -7,5 +7,5 @@
   <link rel="stylesheet" href="css/shared.css">
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
-<script type="application/dart;component=1" src="script_ref.dart"></script>
+<script type="application/dart" src="script_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
index 9876a42..accb51f 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
@@ -25,5 +25,5 @@
   <h1>script {{ script.name }}</h1>
   </script-inset>
 </template>
-<script type="application/dart;component=1" src="script_view.dart"></script>
+<script type="application/dart" src="script_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
index da7f132..95e7972 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
@@ -14,5 +14,5 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="service_error_view.dart"></script>
+  <script type="application/dart" src="service_error_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
index 709e41f..855417e 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
@@ -17,5 +17,5 @@
       </template>
     </div>
   </template>
-  <script type="application/dart;component=1" src="service_exception_view.dart"></script>
+  <script type="application/dart" src="service_exception_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_ref.html
index d5efab1..1818675 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_ref.html
@@ -2,5 +2,5 @@
   <link rel="import" href="observatory_element.html">
 </head>
 <polymer-element name="service-ref" extends="observatory-element">
-  <script type="application/dart;component=1" src="service_ref.dart"></script>
+  <script type="application/dart" src="service_ref.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_view.html
index 1a12e6d..22b3b98 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_view.html
@@ -18,5 +18,5 @@
 <polymer-element name="service-view" extends="observatory-element">
   <!-- This element explicitly manages the child elements to avoid setting
        an observable property on the old element to an invalid type. -->
-  <script type="application/dart;component=1" src="service_view.dart"></script>
+  <script type="application/dart" src="service_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/sliding_checkbox.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/sliding_checkbox.html
index 760fb65..80f39aa 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/sliding_checkbox.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/sliding_checkbox.html
@@ -83,5 +83,5 @@
       </label>
     </div>
   </template>
-  <script type="application/dart;component=1" src="sliding_checkbox.dart"></script>
+  <script type="application/dart" src="sliding_checkbox.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
index 2691125..c03e148 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
@@ -37,5 +37,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="stack_frame.dart"></script>
+  <script type="application/dart" src="stack_frame.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
index 132a486..bd3e569 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
@@ -27,5 +27,5 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart;component=1" src="stack_trace.dart"></script>
+  <script type="application/dart" src="stack_trace.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
index 75d1507..07155df 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
@@ -5,5 +5,5 @@
 <template><link rel="stylesheet" href="css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
-<script type="application/dart;component=1" src="vm_ref.dart"></script>
+<script type="application/dart" src="vm_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
index 448d8f4..226d085 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
@@ -36,6 +36,12 @@
           <div class="memberName">asserts enabled</div>
           <div class="memberValue">{{ vm.assertsEnabled }}</div>
         </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="#/flags">flags</a>
+          </div>
+        </div>
       </div>
     </div>
 
@@ -51,5 +57,5 @@
       </template>
     </ul>
   </template>
-  <script type="application/dart;component=1" src="vm_view.dart"></script>
+  <script type="application/dart" src="vm_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/boot.js b/runtime/bin/vmservice/client/deployed/web/packages/polymer/boot.js
index a4a148e..62d72a7 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/polymer/boot.js
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/boot.js
@@ -2,55 +2,35 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// Bootstrap to initialize polymer applications. This library is will be
-/// replaced by boot.dart in the near future (see dartbug.com/18007).
+/// Experimental bootstrap to initialize polymer applications. This library is
+/// not used by default, and may be replaced by Dart code in the near future.
 ///
 /// This script contains logic to bootstrap polymer apps during development. It
-/// internally discovers special Dart script tags through HTML imports, and
-/// constructs a new entrypoint for the application that is then launched in an
-/// isolate.
+/// internally discovers Dart script tags through HTML imports, and constructs
+/// a new entrypoint for the application that is then launched in an isolate.
 ///
 /// For each script tag found, we will load the corresponding Dart library and
 /// execute all methods annotated with `@initMethod` and register all classes
 /// labeled with `@CustomTag`. We keep track of the order of imports and execute
 /// initializers in the same order.
 ///
-/// All polymer applications use this bootstrap logic. It is included
-/// automatically when you include the polymer.html import:
+/// You can this experimental bootstrap logic by including the
+/// polymer_experimental.html import, instead of polymer.html:
 ///
-///    <link rel="import" href="packages/polymer/polymer.html">
+///    <link rel="import" href="packages/polymer/polymer_experimental.html">
 ///
-/// There are two important changes compared to previous versions of polymer
-/// (0.10.0-pre.6 and older):
-///
-///   * Use 'application/dart;component=1' instead of 'application/dart':
-///   Dartium already limits to have a single script tag per document, but it
-///   will be changing semantics soon and make them even stricter. Multiple
-///   script tags are not going to be running on the same isolate after this
-///   change. For polymer applications we'll use a parameter on the script tags
-///   mime-type to prevent Dartium from loading them separately. Instead this
-///   bootstrap script combines those special script tags and creates the
-///   application Dartium needs to run.
-///
-//    If you had:
-///
-///      <polymer-element name="x-foo"> ...
-///      <script type="application/dart" src="x_foo.dart'></script>
-///
-///   Now you need to write:
-///
-///      <polymer-element name="x-foo"> ...
-///      <script type="application/dart;component=1" src="x_foo.dart'></script>
-///
-///   * `initPolymer` is gone: we used to initialize applications in two
-///   possible ways: using `init.dart` or invoking initPolymer in your main. Any
-///   of these initialization patterns can be replaced to use an `@initMethod`
-///   instead. For example, If you need to run some initialization code before
-///   any other code is executed, include a "application/dart;component=1"
-///   script tag that contains an initializer method with the body of your old
-///   main, and make sure this tag is placed above other html-imports that load
-///   the rest of the application. Initialization methods are executed in the
-///   order in which they are discovered in the HTML document.
+/// This bootstrap replaces `initPolymer` so Dart code might need to be changed
+/// too. If you loaded init.dart directly, you can remove it. But if you invoke
+/// initPolymer in your main, you should remove that call and change to use
+/// `@initMethod` instead. The current bootstrap doesn't support having Dart
+/// script tags in the main page, so you may need to move some code into an HTML
+/// import. For example, If you need to run some initialization code before any
+/// other code is executed, include an HTML import to an html file with a
+/// "application/dart" script tag that contains an initializer
+/// method with the body of your old main, and make sure this tag is placed
+/// above other html-imports that load the rest of the application.
+/// Initialization methods are executed in the order in which they are
+/// discovered in the HTML document.
 (function() {
   // Only run in Dartium.
   if (navigator.userAgent.indexOf('(Dart)') === -1) return;
@@ -91,7 +71,7 @@
         '}\n');
   }
 
-  function discoverScripts(content, state) {
+  function discoverScripts(content, state, importedDoc) {
     if (!state) {
       // internal state tracking documents we've visited, the resulting list of
       // scripts, and any tags with the incorrect mime-type.
@@ -111,12 +91,12 @@
 
         if (state.seen[node.href]) continue;
         state.seen[node.href] = node;
-        discoverScripts(node.import, state);
+        discoverScripts(node.import, state, true);
       } else if (node instanceof HTMLScriptElement) {
-        if (node.type == 'application/dart;component=1') {
+        if (node.type != 'application/dart') continue;
+        if (importedDoc) {
           state.scripts.push(getScriptUrl(node));
-        }
-        if (node.type == 'application/dart') {
+        } else {
           state.badTags.push(node);
         }
       }
@@ -133,11 +113,11 @@
 
     var results = discoverScripts(document);
     if (results.badTags.length > 0) {
-      console.warn('Dartium currently only allows a single Dart script tag '
-        + 'per application, and in the future it will run them in '
-        + 'separtate isolates.  To prepare for this all the following '
-        + 'script tags need to be updated to use the mime-type '
-        + '"application/dart;component=1" instead of "application/dart":');
+      console.warn('The experimental polymer boostrap does not support '
+        + 'having script tags in the main document. You can move the script '
+        + 'tag to an HTML import instead. Also make sure your script tag '
+        + 'doesn\'t have a main, but a top-level method marked with '
+        + '@initMethod instead');
       for (var i = 0; i < results.badTags.length; i++) {
         console.warn(results.badTags[i]);
       }
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/polymer.html b/runtime/bin/vmservice/client/deployed/web/packages/polymer/polymer.html
index 5cbaf79..9a90ea1 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/polymer/polymer.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/polymer.html
@@ -24,9 +24,3 @@
 
 <!-- Teach dart2js about Shadow DOM polyfill objects. -->
 <script src="../../packages/web_components/dart_support.js"></script>
-
-<!-- Bootstrap the user application in a new isolate. -->
-<script src="boot.js"></script>
-<!-- TODO(sigmund): replace boot.js by boot.dart (dartbug.com/18007)
-<script type="application/dart">export "package:polymer/boot.dart";</script>
- -->
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/polymer_experimental.html b/runtime/bin/vmservice/client/deployed/web/packages/polymer/polymer_experimental.html
new file mode 100644
index 0000000..f2909de
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/polymer_experimental.html
@@ -0,0 +1,9 @@
+<!--
+ Copyright 2013 The Polymer Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style
+ license that can be found in the LICENSE file.
+-->
+<link rel="import" href="polymer.html">
+
+<!-- Experimental: bootstrap the user application in a new isolate. -->
+<script src="boot.js"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.html b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.html
index ae23866..7a92125 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.html
@@ -5,4 +5,4 @@
 -->
 <script src="polymer.js"></script>
 <!-- <link rel="import" href="../polymer-dev/polymer.html"> -->
-<link rel="import" href="polymer-body.html">
\ No newline at end of file
+<link rel="import" href="polymer-body.html">
diff --git a/runtime/bin/vmservice/client/lib/elements.dart b/runtime/bin/vmservice/client/lib/elements.dart
index 95d065c..146b624 100644
--- a/runtime/bin/vmservice/client/lib/elements.dart
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -14,6 +14,7 @@
 export 'package:observatory/src/elements/eval_link.dart';
 export 'package:observatory/src/elements/field_ref.dart';
 export 'package:observatory/src/elements/field_view.dart';
+export 'package:observatory/src/elements/flag_list.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';
diff --git a/runtime/bin/vmservice/client/lib/elements.html b/runtime/bin/vmservice/client/lib/elements.html
index ee101d2..c104893 100644
--- a/runtime/bin/vmservice/client/lib/elements.html
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -14,6 +14,7 @@
   <link rel="import" href="src/elements/eval_link.html">
   <link rel="import" href="src/elements/field_ref.html">
   <link rel="import" href="src/elements/field_view.html">
+  <link rel="import" href="src/elements/flag_list.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">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/action_link.dart b/runtime/bin/vmservice/client/lib/src/elements/action_link.dart
index 2a1dc93..5d64b1e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/action_link.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/action_link.dart
@@ -4,7 +4,6 @@
 
 library action_link_element;
 
-import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
 @CustomTag('action-link')
diff --git a/runtime/bin/vmservice/client/lib/src/elements/action_link.html b/runtime/bin/vmservice/client/lib/src/elements/action_link.html
index fa691cb..7c1974f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/action_link.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/action_link.html
@@ -22,5 +22,5 @@
     </template>
 
   </template>
-  <script type="application/dart;component=1" src="action_link.dart"></script>
+  <script type="application/dart" src="action_link.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
index 3fbb4c0..564dad4 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
@@ -26,5 +26,5 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart;component=1" src="breakpoint_list.dart"></script>
+  <script type="application/dart" src="breakpoint_list.dart"></script>
 </polymer-element>
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 043ecce..0b595f6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
@@ -5,5 +5,5 @@
 
 <template><link rel="stylesheet" href="css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
-<script type="application/dart;component=1" src="class_ref.dart"></script>
+<script type="application/dart" src="class_ref.dart"></script>
 </polymer-element>
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 79ccf65..7548085 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -147,5 +147,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart;component=1" src="class_view.dart"></script>
+  <script type="application/dart" src="class_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
index f18b3ca..e14384c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
@@ -16,5 +16,5 @@
       <span>{{ name }}</span>
     </template>
   </template>
-<script type="application/dart;component=1" src="code_ref.dart"></script>
+<script type="application/dart" src="code_ref.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_view.dart b/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
index b42e63e..dd5c969 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
@@ -28,7 +28,7 @@
     code.reload().whenComplete(done);
   }
 
-  Element _findJumpTarget(Node target) {
+  Element _findJumpTarget(Element target) {
     var jumpTarget = target.attributes['data-jump-target'];
     if (jumpTarget == '') {
       return null;
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 a40131f..f04fd06 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -162,5 +162,5 @@
       </template>
     </div>
   </template>
-  <script type="application/dart;component=1" src="code_view.dart"></script>
+  <script type="application/dart" src="code_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html b/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
index 2e2f371..035e312 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
@@ -13,5 +13,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="collapsible_content.dart"></script>
+  <script type="application/dart" src="collapsible_content.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
index 06f2c11..2806d6d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
@@ -56,7 +56,12 @@
 
 em {
   color: inherit;
-  font-style:italic;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
 }
 
 hr {
@@ -224,3 +229,7 @@
   border-radius: 4px;
   box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
 }
+
+.break-wrap {
+  word-wrap: break-word;
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/curly_block.html b/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
index 16f3270..d105267 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
@@ -36,5 +36,5 @@
       </template>
     </template>
   </template>
-  <script type="application/dart;component=1" src="curly_block.dart"></script>
+  <script type="application/dart" src="curly_block.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/error_view.html b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
index 9f5de00..ba54e66 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
@@ -14,5 +14,5 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="error_view.dart"></script>
+  <script type="application/dart" src="error_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_box.dart b/runtime/bin/vmservice/client/lib/src/elements/eval_box.dart
index 4322866..f8285f2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_box.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_box.dart
@@ -10,7 +10,7 @@
 import 'package:polymer/polymer.dart';
 
 
-typedef Future<ObservableMap> evalType(String text);
+typedef Future evalType(String text);
 
 
 @CustomTag('eval-box')
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
index add16d3..7d4d50b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
@@ -83,4 +83,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart;component=1" src="eval_box.dart"></script>
+<script type="application/dart" src="eval_box.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_link.html b/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
index dcc7746..729698e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
@@ -25,5 +25,5 @@
     </template>
 
   </template>
-  <script type="application/dart;component=1" src="eval_link.dart"></script>
+  <script type="application/dart" src="eval_link.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
index ebf0a1e..6de1a19 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
@@ -20,5 +20,5 @@
       <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
     </div>
   </template>
-  <script type="application/dart;component=1" src="field_ref.dart"></script>
+  <script type="application/dart" src="field_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_view.html b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
index ead150d..5673bbf 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
@@ -90,5 +90,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="field_view.dart"></script>
+  <script type="application/dart" src="field_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/flag_list.dart b/runtime/bin/vmservice/client/lib/src/elements/flag_list.dart
new file mode 100644
index 0000000..c5a9bdc
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/flag_list.dart
@@ -0,0 +1,27 @@
+// 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 flag_list_element;
+
+import 'package:polymer/polymer.dart';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+
+@CustomTag('flag-list')
+class FlagListElement extends ObservatoryElement {
+  @published ServiceMap flagList;
+
+  FlagListElement.created() : super.created();
+
+  void refresh(var done) {
+    flagList.reload().whenComplete(done);
+  }
+}
+
+@CustomTag('flag-item')
+class FlagItemElement extends ObservatoryElement {
+  @published ObservableMap flag;
+
+  FlagItemElement.created() : super.created();
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/flag_list.html b/runtime/bin/vmservice/client/lib/src/elements/flag_list.html
new file mode 100644
index 0000000..cabdd91
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/flag_list.html
@@ -0,0 +1,55 @@
+<head>
+  <link rel="import" href="nav_bar.html">
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="stack_frame.html">
+</head>
+
+<polymer-element name="flag-list" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <nav-menu link="{{ flagList.isolate.relativeHashLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content-centered">
+      <template if="{{ flagList['modifiedFlags'].isNotEmpty }}">
+        <h1>Modified Flags</h1>
+        <br>
+        <template repeat="{{ flag in flagList['modifiedFlags'] }}">
+          <flag-item flag="{{ flag }}"></flag-item>
+          <br>
+        </template>
+        <hr>
+      </template>
+
+      <h1>Unmodified Flags</h1>
+      <br>
+      <template if="{{ flagList['unmodifiedFlags'].isEmpty }}">
+        <em>None</em>
+      </template>
+      <template if="{{ flagList['unmodifiedFlags'].isNotEmpty }}">
+        <template repeat="{{ flag in flagList['unmodifiedFlags'] }}">
+          <flag-item flag="{{ flag }}"></flag-item>
+          <br>
+        </template>
+      </template>
+    </div>
+
+  </template>
+</polymer-element>
+
+<polymer-element name="flag-item" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <span style="color:#aaa">// {{ flag['comment'] }}</span>
+    <div style="padding: 3px 0">
+      <b>{{ flag['name'] }}</b>
+      &nbsp;=&nbsp;
+      {{ flag['valueAsString'] }}
+    </div>
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="flag_list.dart"></script>
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 e29c2b0..70e5e96 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
@@ -12,5 +12,5 @@
           </function-ref>.<!--
      --></template><a href="{{ url }}">{{ name }}</a><!--
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
-<script type="application/dart;component=1" src="function_ref.dart"></script>
+<script type="application/dart" src="function_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.html b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
index 137b065..eb5bf6b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -115,5 +115,5 @@
 
     <br>
   </template>
-  <script type="application/dart;component=1" src="function_view.dart"></script>
+  <script type="application/dart" src="function_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
index dfe2797..9f5b556 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
@@ -35,5 +35,5 @@
     <canvas id="fragmentation" width="1px" height="1px"></canvas>
   </div>
 </template>
-<script type="application/dart;component=1" src="heap_map.dart"></script>
+<script type="application/dart" src="heap_map.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
index 4454a82..aea9cd7 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
@@ -116,5 +116,5 @@
     </table>
   </div>
 </template>
-<script type="application/dart;component=1" src="heap_profile.dart"></script>
+<script type="application/dart" src="heap_profile.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 6627285..943ccda 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -85,5 +85,5 @@
       </template>
     </span>
   </template>
-  <script type="application/dart;component=1" src="instance_ref.dart"></script>
+  <script type="application/dart" src="instance_ref.dart"></script>
 </polymer-element>
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 bdf61c8..215d670 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -182,5 +182,5 @@
 
     </template>
   </template>
-  <script type="application/dart;component=1" src="instance_view.dart"></script>
+  <script type="application/dart" src="instance_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/io_view.dart b/runtime/bin/vmservice/client/lib/src/elements/io_view.dart
index 0796775..9e93387 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/io_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/io_view.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -21,6 +21,11 @@
   }
 }
 
+@CustomTag('io-ref')
+class IORefElement extends ServiceRefElement {
+  IORefElement.created() : super.created();
+}
+
 @CustomTag('io-http-server-list-view')
 class IOHttpServerListViewElement extends ObservatoryElement {
   @published ServiceMap list;
@@ -70,4 +75,162 @@
       _updateTimer = null;
     }
   }
-}
\ No newline at end of file
+}
+
+@CustomTag('io-socket-ref')
+class IOSocketRefElement extends ServiceRefElement {
+  IOSocketRefElement.created() : super.created();
+}
+
+@CustomTag('io-socket-list-view')
+class IOSocketListViewElement extends ObservatoryElement {
+  @published ServiceMap list;
+
+  IOSocketListViewElement.created() : super.created();
+
+  void refresh(var done) {
+    list.reload().whenComplete(done);
+  }
+}
+
+@CustomTag('io-socket-view')
+class IOSocketViewElement extends ObservatoryElement {
+  @published Socket socket;
+
+  IOSocketViewElement.created() : super.created();
+
+  void refresh(var done) {
+    socket.reload().whenComplete(done);
+  }
+}
+
+@CustomTag('io-web-socket-ref')
+class IOWebSocketRefElement extends ServiceRefElement {
+  IOWebSocketRefElement.created() : super.created();
+}
+
+@CustomTag('io-web-socket-list-view')
+class IOWebSocketListViewElement extends ObservatoryElement {
+  @published ServiceMap list;
+
+  IOWebSocketListViewElement.created() : super.created();
+
+  void refresh(var done) {
+    list.reload().whenComplete(done);
+  }
+}
+
+@CustomTag('io-web-socket-view')
+class IOWebSocketViewElement extends ObservatoryElement {
+  @published ServiceMap webSocket;
+
+  IOWebSocketViewElement.created() : super.created();
+
+  void refresh(var done) {
+    webSocket.reload().whenComplete(done);
+  }
+}
+
+@CustomTag('io-random-access-file-list-view')
+class IORandomAccessFileListViewElement extends ObservatoryElement {
+  @published ServiceMap list;
+
+  IORandomAccessFileListViewElement.created() : super.created();
+
+  void refresh(var done) {
+    list.reload().whenComplete(done);
+  }
+}
+
+@CustomTag('io-random-access-file-ref')
+class IORandomAccessFileRefElement extends ServiceRefElement {
+  IORandomAccessFileRefElement.created() : super.created();
+}
+
+@CustomTag('io-random-access-file-view')
+class IORandomAccessFileViewElement extends ObservatoryElement {
+  // TODO(ajohnsen): Create a RandomAccessFile object.
+  @published ServiceMap file;
+  Timer _updateTimer;
+
+  IORandomAccessFileViewElement.created() : super.created();
+
+  void refresh(var done) {
+    file.reload().whenComplete(done);
+  }
+
+  void _updateFile() {
+    refresh(() {
+      if (_updateTimer != null) {
+        _updateTimer = new Timer(new Duration(seconds: 1), _updateFile);
+      }
+    });
+  }
+
+  void enteredView() {
+    super.enteredView();
+    // Start a timer to update the isolate summary once a second.
+    _updateTimer = new Timer(new Duration(seconds: 1), _updateFile);
+  }
+
+  void leftView() {
+    super.leftView();
+    if (_updateTimer != null) {
+      _updateTimer.cancel();
+      _updateTimer = null;
+    }
+  }
+}
+
+@CustomTag('io-process-list-view')
+class IOProcessListViewElement extends ObservatoryElement {
+  @published ServiceMap list;
+
+  IOProcessListViewElement.created() : super.created();
+
+  void refresh(var done) {
+    list.reload().whenComplete(done);
+  }
+}
+
+@CustomTag('io-process-ref')
+class IOProcessRefElement extends ServiceRefElement {
+  // Only display the process name when small is set.
+  @published bool small = false;
+  IOProcessRefElement.created() : super.created();
+}
+
+@CustomTag('io-process-view')
+class IOProcessViewElement extends ObservatoryElement {
+  // TODO(ajohnsen): Create a Process object.
+  @published ServiceMap process;
+  Timer _updateTimer;
+
+  IOProcessViewElement.created() : super.created();
+
+  void refresh(var done) {
+    process.reload().whenComplete(done);
+  }
+
+  void _updateFile() {
+    refresh(() {
+      if (_updateTimer != null) {
+        _updateTimer = new Timer(new Duration(seconds: 1), _updateFile);
+      }
+    });
+  }
+
+  void enteredView() {
+    super.enteredView();
+    // Start a timer to update the isolate summary once a second.
+    _updateTimer = new Timer(new Duration(seconds: 1), _updateFile);
+  }
+
+  void leftView() {
+    super.leftView();
+    if (_updateTimer != null) {
+      _updateTimer.cancel();
+      _updateTimer = null;
+    }
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/io_view.html b/runtime/bin/vmservice/client/lib/src/elements/io_view.html
index 62a1346..4343aec 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/io_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/io_view.html
@@ -22,12 +22,63 @@
           <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
         </li>
       </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a>
+        </li>
+      </ul>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a>
+        </li>
+      </ul>
+
     </div>
     <br>
     <hr>
   </template>
 </polymer-element>
 
+<polymer-element name="io-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <template if="{{ ref.serviceType == 'Socket' }}">
+      <io-socket-ref ref="{{ ref }}"></io-socket-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'HttpServer' }}">
+      <io-http-server-ref ref="{{ ref }}"></io-http-server-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'WebSocket' }}">
+      <io-web-socket-ref ref="{{ ref }}"></io-web-socket-ref>
+    </template>
+    <template if="{{ ref.serviceType == 'Process' }}">
+      <io-process-ref ref="{{ ref }}"></io-process-ref>
+    </template>
+  </template>
+</polymer-element>
+
 <polymer-element name="io-http-server-list-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -78,6 +129,10 @@
 
       <div class="memberList">
         <div class="memberItem">
+          <div class="memberName">Socket</div>
+          <div class="memberValue"><io-socket-ref ref="{{ httpServer['socket'] }}"></io-socket-ref></div>
+        </div>
+        <div class="memberItem">
           <div class="memberName">Address</div>
           <div class="memberValue">{{ httpServer['address'] }}</div>
         </div>
@@ -100,4 +155,379 @@
   </template>
 </polymer-element>
 
-<script type="application/dart;component=1" src="io_view.dart"></script>
+<polymer-element name="io-socket-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-socket-list-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Sockets</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ socket in list['members'] }}">
+          <li class="list-group-item">
+            <io-socket-ref ref="{{ socket }}"></io-socket-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-socket-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <!-- Pipe Socket -->
+      <template if="{{ socket.isPipe }}">
+        <h1>Pipe Socket</h1>
+        <div class="memberList">
+          <template if="{{ socket.socketOwner != null }}">
+            <div class="memberItem">
+              <div class="memberName">Owner</div>
+              <div class="memberValue"><io-ref ref="{{ socket.socketOwner }}"></io-ref></div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">File descriptor</div>
+            <div class="memberValue">{{ socket.fd }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Read Closed</div>
+            <div class="memberValue">{{ socket.readClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Write Closed</div>
+            <div class="memberValue">{{ socket.writeClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Closing</div>
+            <div class="memberValue">{{ socket.closing }}</div>
+          </div>
+        </div>
+      </template>
+      <!-- Network Socket -->
+      <template if="{{ !socket.isPipe }}">
+        <h1>Network Socket</h1>
+        <div class="memberList">
+          <template if="{{ socket.socketOwner != null }}">
+            <div class="memberItem">
+              <div class="memberName">Owner</div>
+              <div class="memberValue"><io-ref ref="{{ socket.socketOwner }}"></io-ref></div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">Local Address</div>
+            <div class="memberValue">{{ socket.localAddress }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Local Port</div>
+            <div class="memberValue">{{ socket.localPort }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Remote Address</div>
+            <div class="memberValue">{{ socket.remoteAddress }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Remote Port</div>
+            <div class="memberValue">{{ socket.remotePort }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">File descriptor</div>
+            <div class="memberValue">{{ socket.fd }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Read Closed</div>
+            <div class="memberValue">{{ socket.readClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Write Closed</div>
+            <div class="memberValue">{{ socket.writeClosed }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Closing</div>
+            <div class="memberValue">{{ socket.closing }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Listening</div>
+            <div class="memberValue">{{ socket.listening }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Protocol</div>
+            <div class="memberValue">{{ socket.protocol }}</div>
+          </div>
+        </div>
+      </template>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-list-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>WebSockets</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ webSocket in list['members'] }}">
+          <li class="list-group-item">
+            <io-web-socket-ref ref="{{ webSocket }}"></io-web-socket-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-web-socket-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>WebSocket</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Socket</div>
+          <div class="memberValue"><io-socket-ref ref="{{ webSocket['socket'] }}"></io-socket-ref></div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-list-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Random Access Files</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ file in list['members'] }}">
+          <li class="list-group-item">
+            <io-random-access-file-ref ref="{{ file }}"></io-random-access-file-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-random-access-file-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Random Access File</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Path</div>
+          <div class="memberValue">{{ file['name'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Pending Operation</div>
+          <div class="memberValue">{{ file['asyncDispatched'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">File Descriptor</div>
+          <div class="memberValue">{{ file['fd'] }}</div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-list-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Processes</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ process in list['members'] }}">
+          <li class="list-group-item">
+            <io-process-ref ref="{{ process }}"></io-process-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <template if="{{ small }}">
+      <a href="{{ url }}">{{ name }}</a>
+    </template>
+    <template if="{{ !small }}">
+      <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
+    </template>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-process-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>Process</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Path</div>
+          <div class="memberValue">{{ process['name'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Pid</div>
+          <div class="memberValue">{{ process['pid'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Arguments</div>
+          <div class="memberValue">{{ process['arguments'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Started</div>
+          <div class="memberValue">{{ process['started'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Working Directory</div>
+          <div class="memberValue">{{ process['workingDirectory'] }}</div>
+        </div>
+        <template if="{{ process['stdin'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stdin</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stdin'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ process['stdout'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stdout</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stdout'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ process['stderr'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">stderr</div>
+            <div class="memberValue">
+              <io-socket-ref ref="{{ process['stderr'] }}"></io-socket-ref>
+            </div>
+          </div>
+        </template>
+      </div>
+
+      <br>
+
+      <h2>Environment</h2>
+      <div class="well">
+        <div class="monospace break-wrap">
+          <template repeat="{{ variable in process['environment'] }}">
+            {{ variable }}
+            <br>
+          </template>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="io_view.dart"></script>
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 dafa994..ea60919 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
@@ -163,6 +163,10 @@
     } catch (e, stackTrace) {
       Logger.root.warning('_buildStackTree', e, stackTrace);
     }
+    // Check if we only have one node at the root and expand it.
+    if (tree.rows.length == 1) {
+      tree.toggle(0);
+    }
     notifyPropertyChange(#tree, null, tree);
   }
 
@@ -186,7 +190,8 @@
     // We only want to expand a tree row if the target of the click is
     // the table cell (passed in as target) or the span containing the
     // expander symbol (#expand).
-    if ((e.target.id != 'expand') && (e.target != target)) {
+    var eventTarget = e.target;
+    if ((eventTarget.id != 'expand') && (e.target != target)) {
       // Target of click was not the expander span or the table cell.
       return;
     }
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 7975491..b15b9fc 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -186,5 +186,5 @@
       </table>
     </div>
   </template>
-  <script type="application/dart;component=1" src="isolate_profile.dart"></script>
+  <script type="application/dart" src="isolate_profile.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
index b2858d2..84e4e66 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
@@ -5,5 +5,5 @@
 <template><link rel="stylesheet" href="css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
-<script type="application/dart;component=1" src="isolate_ref.dart"></script>
+<script type="application/dart" src="isolate_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
index 5335782..b35acca 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
@@ -5,11 +5,9 @@
 library isolate_summary_element;
 
 import 'dart:async';
-import 'dart:html';
 import 'observatory_element.dart';
 import 'package:observatory/app.dart';
 import 'package:observatory/service.dart';
-import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
 
 @CustomTag('isolate-summary')
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 8968df2..9ed1e77 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -183,4 +183,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart;component=1" src="isolate_summary.dart"></script>
+<script type="application/dart" src="isolate_summary.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
index f7ab7a8..794b50a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -137,5 +137,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart;component=1" src="isolate_view.dart"></script>
+  <script type="application/dart" src="isolate_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/json_view.html b/runtime/bin/vmservice/client/lib/src/elements/json_view.html
index 100bcc3..f7e42ff 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/json_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/json_view.html
@@ -7,5 +7,5 @@
     </nav-bar>
       <pre>{{ mapAsString }}</pre>
   </template>
-  <script type="application/dart;component=1" src="json_view.dart"></script>
+  <script type="application/dart" src="json_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
index 20242ba..5dbfc55 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
@@ -10,5 +10,5 @@
     <a href="{{ url }}">{{ name }}</a>
   </template>
 </template>
-<script type="application/dart;component=1" src="library_ref.dart"></script>
+<script type="application/dart" src="library_ref.dart"></script>
 </polymer-element>
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 f525cc2..9b4e339 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -137,5 +137,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart;component=1" src="library_view.dart"></script>
+  <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 bac4f72..fd4f762 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -209,4 +209,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart;component=1" src="nav_bar.dart"></script>
+<script type="application/dart" src="nav_bar.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
index 9b77f24..0d34af3 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
@@ -6,5 +6,5 @@
   <template>
     <response-viewer app="{{ this.app }}"></response-viewer>
   </template>
-  <script type="application/dart;component=1" src="observatory_application.dart"></script>
+  <script type="application/dart" src="observatory_application.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html
index c825782..8a24a8c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html
@@ -1,3 +1,3 @@
 <polymer-element name="observatory-element">
-  <script type="application/dart;component=1" src="observatory_element.dart"></script>
+  <script type="application/dart" src="observatory_element.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
index 0ab71dc..230120a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
@@ -6,5 +6,5 @@
   <template>
     <service-view object="{{ app.response }}"></service-view>
   </template>
-  <script type="application/dart;component=1" src="response_viewer.dart"></script>
+  <script type="application/dart" src="response_viewer.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_inset.html b/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
index af4e478..e4023b4 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
@@ -44,5 +44,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="script_inset.dart"></script>
+  <script type="application/dart" src="script_inset.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_ref.html b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
index 9f4445c..07f27f2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
@@ -7,5 +7,5 @@
   <link rel="stylesheet" href="css/shared.css">
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
-<script type="application/dart;component=1" src="script_ref.dart"></script>
+<script type="application/dart" src="script_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.html b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
index 9876a42..accb51f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -25,5 +25,5 @@
   <h1>script {{ script.name }}</h1>
   </script-inset>
 </template>
-<script type="application/dart;component=1" src="script_view.dart"></script>
+<script type="application/dart" src="script_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
index da7f132..95e7972 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
@@ -14,5 +14,5 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="service_error_view.dart"></script>
+  <script type="application/dart" src="service_error_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
index 709e41f..855417e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
@@ -17,5 +17,5 @@
       </template>
     </div>
   </template>
-  <script type="application/dart;component=1" src="service_exception_view.dart"></script>
+  <script type="application/dart" src="service_exception_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_ref.html b/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
index d5efab1..1818675 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
@@ -2,5 +2,5 @@
   <link rel="import" href="observatory_element.html">
 </head>
 <polymer-element name="service-ref" extends="observatory-element">
-  <script type="application/dart;component=1" src="service_ref.dart"></script>
+  <script type="application/dart" src="service_ref.dart"></script>
 </polymer-element>
\ No newline at end of file
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 5817153..6ee3100 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
@@ -44,6 +44,10 @@
         FieldViewElement element = new Element.tag('field-view');
         element.field = object;
         return element;
+      case 'FlagList':
+        FlagListElement element = new Element.tag('flag-list');
+        element.flagList = object;
+        return element;
       case 'Function':
         FunctionViewElement element = new Element.tag('function-view');
         element.function = object;
@@ -101,6 +105,24 @@
             new Element.tag('io-http-server-view');
         element.httpServer = object;
         return element;
+      case 'SocketList':
+        IOSocketListViewElement element =
+            new Element.tag('io-socket-list-view');
+        element.list = object;
+        return element;
+      case 'Socket':
+        IOSocketViewElement element = new Element.tag('io-socket-view');
+        element.socket = object;
+        return element;
+      case 'WebSocketList':
+        IOWebSocketListViewElement element =
+            new Element.tag('io-web-socket-list-view');
+        element.list = object;
+        return element;
+      case 'WebSocket':
+        IOWebSocketViewElement element = new Element.tag('io-web-socket-view');
+        element.webSocket = object;
+        return element;
       case 'Isolate':
         IsolateViewElement element = new Element.tag('isolate-view');
         element.isolate = object;
@@ -109,10 +131,29 @@
         LibraryViewElement element = new Element.tag('library-view');
         element.library = object;
         return element;
+      case 'ProcessList':
+        IOProcessListViewElement element =
+            new Element.tag('io-process-list-view');
+        element.list = object;
+        return element;
+      case 'Process':
+        IOProcessViewElement element = new Element.tag('io-process-view');
+        element.process = object;
+        return element;
       case 'Profile':
         IsolateProfileElement element = new Element.tag('isolate-profile');
         element.profile = object;
         return element;
+      case 'RandomAccessFileList':
+        IORandomAccessFileListViewElement element =
+            new Element.tag('io-random-access-file-list-view');
+        element.list = object;
+        return element;
+      case 'RandomAccessFile':
+        IORandomAccessFileViewElement element =
+            new Element.tag('io-random-access-file-view');
+        element.file = object;
+        return element;
       case 'ServiceError':
         ServiceErrorViewElement element =
             new Element.tag('service-error-view');
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 1a12e6d..22b3b98 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
@@ -18,5 +18,5 @@
 <polymer-element name="service-view" extends="observatory-element">
   <!-- This element explicitly manages the child elements to avoid setting
        an observable property on the old element to an invalid type. -->
-  <script type="application/dart;component=1" src="service_view.dart"></script>
+  <script type="application/dart" src="service_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
index 760fb65..80f39aa 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
@@ -83,5 +83,5 @@
       </label>
     </div>
   </template>
-  <script type="application/dart;component=1" src="sliding_checkbox.dart"></script>
+  <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 2691125..c03e148 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
@@ -37,5 +37,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart;component=1" src="stack_frame.dart"></script>
+  <script type="application/dart" src="stack_frame.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
index 132a486..bd3e569 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
@@ -27,5 +27,5 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart;component=1" src="stack_trace.dart"></script>
+  <script type="application/dart" src="stack_trace.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html b/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
index 75d1507..07155df 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
@@ -5,5 +5,5 @@
 <template><link rel="stylesheet" href="css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
-<script type="application/dart;component=1" src="vm_ref.dart"></script>
+<script type="application/dart" src="vm_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_view.html b/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
index 448d8f4..226d085 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
@@ -36,6 +36,12 @@
           <div class="memberName">asserts enabled</div>
           <div class="memberValue">{{ vm.assertsEnabled }}</div>
         </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="#/flags">flags</a>
+          </div>
+        </div>
       </div>
     </div>
 
@@ -51,5 +57,5 @@
       </template>
     </ul>
   </template>
-  <script type="application/dart;component=1" src="vm_view.dart"></script>
+  <script type="application/dart" src="vm_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index 9665991..7df9eb6 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -27,7 +27,7 @@
   String _serviceType;
 
   /// The complete service url of this object.
-  @reflectable String get link => isolate.relativeLink(_id);
+  @reflectable String get link => _owner.relativeLink(_id);
 
   /// The complete service url of this object with a '#/' prefix.
   // TODO(turnidge): Figure out why using a getter here messes up polymer.
@@ -88,6 +88,9 @@
       case 'Script':
         obj = new Script._empty(owner);
         break;
+      case 'Socket':
+        obj = new Socket._empty(owner);
+        break;
       default:
         obj = new ServiceMap._empty(owner);
     }
@@ -169,6 +172,9 @@
   /// The result may come from the cache.  The result will not necessarily
   /// be [loaded].
   ServiceObject getFromMap(ObservableMap map);
+
+  /// Creates a link to [id] relative to [this].
+  String relativeLink(String id);
 }
 
 /// State for a VM being inspected.
@@ -179,6 +185,7 @@
   @reflectable Iterable<Isolate> get isolates => _isolateCache.values;
 
   @reflectable String get link => '$id';
+  @reflectable String relativeLink(String id) => '$id';
 
   @observable String version = 'unknown';
   @observable String architecture = 'unknown';
@@ -1476,6 +1483,109 @@
   @reflectable bool get isDartCode => kind == CodeKind.Dart;
 }
 
+
+class SocketKind {
+  final _value;
+  const SocketKind._internal(this._value);
+  String toString() => '$_value';
+
+  static SocketKind fromString(String s) {
+    if (s == 'Listening') {
+      return Listening;
+    } else if (s == 'Normal') {
+      return Normal;
+    } else if (s == 'Pipe') {
+      return Pipe;
+    } else if (s == 'Internal') {
+      return Internal;
+    }
+    Logger.root.warning('Unknown socket kind $s');
+    throw new FallThroughError();
+  }
+  static const Listening = const SocketKind._internal('Listening');
+  static const Normal = const SocketKind._internal('Normal');
+  static const Pipe = const SocketKind._internal('Pipe');
+  static const Internal = const SocketKind._internal('Internal');
+}
+
+/// A snapshot of statistics associated with a [Socket].
+class SocketStats {
+  @reflectable final int bytesRead;
+  @reflectable final int bytesWritten;
+  @reflectable final int readCalls;
+  @reflectable final int writeCalls;
+  @reflectable final int available;
+
+  SocketStats(this.bytesRead, this.bytesWritten,
+              this.readCalls, this.writeCalls,
+              this.available);
+}
+
+/// A peer to a Socket in dart:io. Sockets can represent network sockets or
+/// OS pipes. Each socket is owned by another ServceObject, for example,
+/// a process or an HTTP server.
+class Socket extends ServiceObject {
+  Socket._empty(ServiceObjectOwner owner) : super._empty(owner);
+
+  bool get canCache => true;
+
+  ServiceObject socketOwner;
+
+  @reflectable bool get isPipe => (kind == SocketKind.Pipe);
+
+  @observable SocketStats latest;
+  @observable SocketStats previous;
+
+  @observable SocketKind kind;
+
+  @observable String protocol = '';
+
+  @observable bool readClosed = false;
+  @observable bool writeClosed = false;
+  @observable bool closing = false;
+
+  /// Listening for connections.
+  @observable bool listening = false;
+
+  @observable int fd;
+
+  @observable String localAddress;
+  @observable int localPort;
+  @observable String remoteAddress;
+  @observable int remotePort;
+
+  // Updates internal state from [map]. [map] can be a reference.
+  void _update(ObservableMap map, bool mapIsRef) {
+    name = map['name'];
+    vmName = map['name'];
+
+    kind = SocketKind.fromString(map['kind']);
+
+    if (mapIsRef) {
+      return;
+    }
+
+    _loaded = true;
+
+    _upgradeCollection(map, isolate);
+
+    readClosed = map['readClosed'];
+    writeClosed = map['writeClosed'];
+    closing = map['closing'];
+    listening = map['listening'];
+
+    protocol = map['protocol'];
+
+    localAddress = map['localAddress'];
+    localPort = map['localPort'];
+    remoteAddress = map['remoteAddress'];
+    remotePort = map['remotePort'];
+
+    fd = map['fd'];
+    socketOwner = map['owner'];
+  }
+}
+
 // Returns true if [map] is a service map. i.e. it has the following keys:
 // 'id' and a 'type'.
 bool _isServiceMap(ObservableMap m) {
diff --git a/runtime/bin/vmservice/client/pubspec.yaml b/runtime/bin/vmservice/client/pubspec.yaml
index dfd30e1..e54d95c 100644
--- a/runtime/bin/vmservice/client/pubspec.yaml
+++ b/runtime/bin/vmservice/client/pubspec.yaml
@@ -1,7 +1,7 @@
 name: observatory
 version: 0.2.1
 dependencies:
-  polymer: '>= 0.10.0-pre.12'
+  polymer: '>= 0.10.0-pre.13'
 transformers:
 - polymer:
     entry_points: 
diff --git a/runtime/bin/vmservice/client/resources.sh b/runtime/bin/vmservice/client/resources.sh
deleted file mode 100755
index 18a84ac..0000000
--- a/runtime/bin/vmservice/client/resources.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-
-# NOTE: You should only have to run this script if you add a new resource
-# (html, js, image) file.
-
-# This script generates lines for resources_sources.gypi (standalone)
-# and devtools.gypi (Dartium) for the current deployed Observatory.
-
-if [ ! -d deployed ]; then
-  echo "Please run inside client directory"
-fi
-
-PREFIX="vmservice/client"
-echo "For resources_sources.gypi:"
-for i in `find deployed/web/ -not -type d -not -path '*/\.*' -not -path '*~'`; do
-  echo "'$PREFIX/$i',"
-done
-
-PREFIX="../../../../dart/runtime/bin/vmservice/client"
-echo "For devtools.gypi:"
-for i in `find deployed/web/ -not -type d -not -path '*/\.*' -not -path '*~'`; do
-  echo "'$PREFIX/$i',"
-done
diff --git a/runtime/bin/vmservice/client/web/index.html b/runtime/bin/vmservice/client/web/index.html
index cccb646..de3474a 100644
--- a/runtime/bin/vmservice/client/web/index.html
+++ b/runtime/bin/vmservice/client/web/index.html
@@ -6,7 +6,7 @@
   <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <script type="text/javascript" src="https://www.google.com/jsapi"></script>
   <link rel="import" href="packages/observatory/elements.html">
-  <script type="application/dart;component=1" src="main.dart"></script>
+  <script type="application/dart" src="main.dart"></script>
   <script src="packages/browser/dart.js"></script>
 </head>
 <body>
diff --git a/runtime/bin/vmservice/client/web/main.dart b/runtime/bin/vmservice/client/web/main.dart
index 26de4a3..db5153c 100644
--- a/runtime/bin/vmservice/client/web/main.dart
+++ b/runtime/bin/vmservice/client/web/main.dart
@@ -6,8 +6,7 @@
 import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 
-@initMethod
-init() {
+main() {
   Logger.root.level = Level.INFO;
   Logger.root.onRecord.listen((LogRecord rec) {
       if (rec.level == Level.WARNING &&
@@ -20,7 +19,9 @@
       print('${rec.level.name}: ${rec.time}: ${rec.message}');
   });
   Logger.root.info('Starting Observatory');
-  Polymer.onReady.then((_) => GoogleChart.initOnce().then((_) {
-    Logger.root.info('Polymer Ready.');
-  }));
+  GoogleChart.initOnce().then((_) {
+    // Charts loaded, initialize polymer.
+    Logger.root.info('Initializing Polymer');
+    initPolymer();
+  });
 }
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 7aded50..2f844f3 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -982,6 +982,16 @@
  * Describe whether isolates are allowed to migrate. */
 
 /**
+ * Notifies the VM that the current isolate is about to make a blocking call.
+ */
+DART_EXPORT void Dart_IsolateBlocked();
+
+/**
+ * Notifies the VM that the current isolate is no longer blocked.
+ */
+DART_EXPORT void Dart_IsolateUnblocked();
+
+/**
  * Exits an isolate. After this call, Dart_CurrentIsolate will
  * return NULL.
  *
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index add3c51..acf9968 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -274,4 +274,40 @@
       native "Isolate_spawnFunction";
 
   static SendPort _spawnUri(String uri) native "Isolate_spawnUri";
+
+  /* patch */ void _pause(Capability resumeCapability) {
+    throw new UnsupportedError("pause");
+  }
+
+  /* patch */ void resume(Capability resumeCapability) {
+    throw new UnsupportedError("resume");
+  }
+
+  /* patch */ void addOnExitListener(SendPort responsePort) {
+    throw new UnsupportedError("addOnExitListener");
+  }
+
+  /* patch */ void removeOnExitListener(SendPort responsePort) {
+    throw new UnsupportedError("removeOnExitListener");
+  }
+
+  /* patch */ void setErrorsFatal(bool errorsAreFatal) {
+    throw new UnsupportedError("setErrorsFatal");
+  }
+
+  /* patch */ void kill([int priority = BEFORE_NEXT_EVENT]) {
+    throw new UnsupportedError("kill");
+  }
+
+  /* patch */ void ping(SendPort responsePort, [int pingType = IMMEDIATE]) {
+    throw new UnsupportedError("ping");
+  }
+
+  /* patch */ void addErrorListener(SendPort port) {
+    throw new UnsupportedError("addErrorListener");
+  }
+
+  /* patch */ void removeErrorListener(SendPort port) {
+    throw new UnsupportedError("removeErrorListener");
+  }
 }
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index cfcebe1..b66088c 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -20,9 +20,6 @@
     "Wrap compilation errors that occur during reflective access in a "
     "MirroredCompilationError, rather than suspending the isolate.");
 
-DEFINE_FLAG(bool, support_find_in_context, false,
-    "Experimental support for ClosureMirror.findInContext.");
-
 static RawInstance* CreateMirror(const String& mirror_class_name,
                                  const Array& constructor_arguments) {
   const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary());
@@ -675,67 +672,6 @@
 }
 
 
-// TODO(13656): Remove AllowPrivate.
-static RawInstance* InvokeLibraryGetterAllowImports(
-    const Library& library,
-    const String& getter_name,
-    const bool throw_nsm_if_absent) {
-  // To access a top-level we may need to use the Field or the getter Function.
-  // The getter function may either be in the library or in the field's owner
-  // class, depending on whether it was an actual getter, or an uninitialized
-  // field.
-  const Field& field = Field::Handle(
-      library.LookupFieldAllowPrivate(getter_name));
-  Function& getter = Function::Handle();
-  if (field.IsNull()) {
-    // No field found. Check for a getter in the lib.
-    const String& internal_getter_name =
-        String::Handle(Field::GetterName(getter_name));
-    getter = library.LookupFunctionAllowPrivate(internal_getter_name);
-    if (getter.IsNull()) {
-      getter = library.LookupFunctionAllowPrivate(getter_name);
-      if (!getter.IsNull()) {
-        // Looking for a getter but found a regular method: closurize it.
-        const Function& closure_function =
-            Function::Handle(getter.ImplicitClosureFunction());
-        return closure_function.ImplicitStaticClosure();
-      }
-    }
-  } else {
-    if (!field.IsUninitialized()) {
-      return field.value();
-    }
-    // An uninitialized field was found.  Check for a getter in the field's
-    // owner classs.
-    const Class& klass = Class::Handle(field.owner());
-    const String& internal_getter_name =
-        String::Handle(Field::GetterName(getter_name));
-    getter = klass.LookupStaticFunction(internal_getter_name);
-  }
-
-  if (!getter.IsNull() && getter.is_visible()) {
-    // Invoke the getter and return the result.
-    const Object& result = Object::Handle(
-        DartEntry::InvokeFunction(getter, Object::empty_array()));
-    return ReturnResult(result);
-  }
-
-  if (throw_nsm_if_absent) {
-    ThrowNoSuchMethod(Instance::null_instance(),
-                      getter_name,
-                      getter,
-                      InvocationMirror::kTopLevel,
-                      InvocationMirror::kGetter);
-    UNREACHABLE();
-  }
-
-  // Fall through case: Indicate that we didn't find any function or field using
-  // a special null instance. This is different from a field being null. Callers
-  // make sure that this null does not leak into Dartland.
-  return Object::sentinel().raw();
-}
-
-
 static RawInstance* InvokeClassGetter(const Class& klass,
                                       const String& getter_name,
                                       const bool throw_nsm_if_absent) {
@@ -780,8 +716,6 @@
 }
 
 
-
-
 static RawInstance* InvokeInstanceGetter(const Class& klass,
                                          const Instance& reflectee,
                                          const String& getter_name,
@@ -813,158 +747,6 @@
 }
 
 
-static RawInstance* LookupFunctionOrFieldInLibraryPrefix(
-    const LibraryPrefix& prefix,
-    const String& lookup_name) {
-  const Object& entry = Object::Handle(prefix.LookupObject(lookup_name));
-  if (!entry.IsNull()) {
-    if (entry.IsField()) {
-      const Field& field = Field::Cast(entry);
-      const Class& field_owner = Class::Handle(field.owner());
-      const Library& field_library = Library::Handle(field_owner.library());
-      const Instance& result = Instance::Handle(
-          InvokeLibraryGetterAllowImports(field_library, lookup_name, false));
-      if (result.raw() != Object::sentinel().raw()) {
-        return result.raw();
-      }
-    } else if (entry.IsFunction()) {
-      const Function& func = Function::Cast(entry);
-      const Function& closure_function = Function::Handle(
-          func.ImplicitClosureFunction());
-      return closure_function.ImplicitStaticClosure();
-    }
-  }
-
-  // Fall through case: Indicate that we didn't find any function or field using
-  // a special null instance. This is different from a field being null. Callers
-  // make sure that this null does not leak into Dartland.
-  return Object::sentinel().raw();
-}
-
-
-static RawInstance* LookupStaticFunctionOrFieldInClass(
-    const Class& klass,
-    const String& lookup_name) {
-  Instance& result = Instance::Handle(
-      InvokeClassGetter(klass, lookup_name, false));
-  if (result.raw() != Object::sentinel().raw()) {
-    return result.raw();
-  }
-
-  const Function& func =
-      Function::Handle(klass.LookupStaticFunction(lookup_name));
-  if (!func.IsNull()) {
-    const Function& closure_function = Function::Handle(
-        func.ImplicitClosureFunction());
-    ASSERT(!closure_function.IsNull());
-    return closure_function.ImplicitStaticClosure();
-  }
-
-  // Fall through case: Indicate that we didn't find any function or field using
-  // a special null instance. This is different from a field being null. Callers
-  // make sure that this null does not leak into Dartland.
-  return Object::sentinel().raw();
-}
-
-
-static RawInstance* LookupFunctionOrFieldInFunctionContext(
-    const Function& func,
-    const Context& ctx,
-    const String& lookup_name) {
-  const ContextScope& ctx_scope = ContextScope::Handle(func.context_scope());
-  intptr_t this_index = -1;
-
-  // Search local context.
-  String& name = String::Handle();
-  for (intptr_t i = 0; i < ctx_scope.num_variables(); i++) {
-    name ^= ctx_scope.NameAt(i);
-    if (name.Equals(lookup_name)) {
-      return ctx.At(i);
-    } else if (name.Equals(Symbols::This())) {
-      // Record instance index to search for the field in the instance
-      // afterwards.
-      this_index = i;
-    }
-  }
-
-  // Search the instance this function is attached to.
-  if (this_index >= 0) {
-    // Since we want the closurized version of a function, we can access, both,
-    // functions and fields through their implicit getter name. If the implicit
-    // getter does not exist for the function, a method extractor will be
-    // created.
-    const Class& owner = Class::Handle(func.Owner());
-    const Instance& receiver = Instance::Handle(ctx.At(this_index));
-    return InvokeInstanceGetter(owner, receiver, lookup_name, false);
-  }
-
-  // Fall through case: Indicate that we didn't find any function or field using
-  // a special null instance. This is different from a field being null. Callers
-  // make sure that this null does not leak into Dartland.
-  return Object::sentinel().raw();
-}
-
-
-static RawInstance* LookupFunctionOrFieldInLibraryHelper(
-    const Library& library,
-    const String& class_name,
-    const String& lookup_name) {
-  if (class_name.IsNull()) {
-    const Instance& result = Instance::Handle(
-        InvokeLibraryGetterAllowImports(library, lookup_name, false));
-    if (result.raw() != Object::sentinel().raw()) {
-      return result.raw();
-    }
-    const Function& func = Function::Handle(
-        library.LookupLocalFunction(lookup_name));
-    if (!func.IsNull()) {
-      const Function& closure_function = Function::Handle(
-          func.ImplicitClosureFunction());
-      return closure_function.ImplicitStaticClosure();
-    }
-  } else {
-    const Class& cls = Class::Handle(
-        library.LookupClass(class_name));
-    if (!cls.IsNull()) {
-      return LookupStaticFunctionOrFieldInClass(cls, lookup_name);
-    }
-  }
-
-  // Fall through case: Indicate that we didn't find any function or field using
-  // a special null instance. This is different from a field being null. Callers
-  // make sure that this null does not leak into Dartland.
-  return Object::sentinel().raw();
-}
-
-
-static RawInstance* LookupFunctionOrFieldInLibrary(const Library& library,
-                                                   const String& class_name,
-                                                   const String& lookup_name) {
-  Instance& result = Instance::Handle();
-  // Check current library.
-  result ^= LookupFunctionOrFieldInLibraryHelper(
-      library, class_name, lookup_name);
-  if (result.raw() != Object::sentinel().raw()) {
-    return result.raw();
-  }
-  // Check all imports.
-  Library& lib_it = Library::Handle();
-  for (intptr_t i = 0; i < library.num_imports(); i++) {
-    lib_it ^= library.ImportLibraryAt(i);
-    result ^= LookupFunctionOrFieldInLibraryHelper(
-        lib_it, class_name, lookup_name);
-    if (result.raw() != Object::sentinel().raw()) {
-      return result.raw();
-    }
-  }
-
-  // Fall through case: Indicate that we didn't find any function or field using
-  // a special null instance. This is different from a field being null. Callers
-  // make sure that this null does not leak into Dartland.
-  return Object::sentinel().raw();
-}
-
-
 static RawAbstractType* InstantiateType(const AbstractType& type,
                                         const AbstractType& instantiator) {
   ASSERT(type.IsFinalized());
@@ -1571,90 +1353,6 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(ClosureMirror_find_in_context, 2) {
-  if (!FLAG_support_find_in_context) {
-    return Object::empty_array().raw();
-  }
-
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Array, lookup_parts, arguments->NativeArgAt(1));
-  ASSERT(lookup_parts.Length() >= 1 && lookup_parts.Length() <= 3);
-
-  if (!closure.IsClosure()) {
-    const Array& result_tuple = Array::Handle(Array::New(2));
-    result_tuple.SetAt(0, Bool::False());
-    return result_tuple.raw();
-  }
-
-  Function& function = Function::Handle();
-  const bool callable = closure.IsCallable(&function, NULL);
-  ASSERT(callable);
-
-  const intptr_t parts_len = lookup_parts.Length();
-  // Lookup name is always the last part.
-  const String& lookup_name = String::Handle(String::RawCast(
-      lookup_parts.At(parts_len - 1)));
-
-  String& part_name = String::Handle();
-  Class& owner = Class::Handle(function.Owner());
-  LibraryPrefix& prefix = LibraryPrefix::Handle();
-  Library& this_library = Library::Handle(owner.library());
-  Instance& result = Instance::Handle(Object::sentinel().raw());
-  if (parts_len == 1) {
-    // Could be either a field in context, an instance or static field of the
-    // enclosing class, or a field in the current library or any imported
-    // library.
-    result ^= LookupFunctionOrFieldInFunctionContext(
-        function, Context::Handle(Closure::context(closure)), lookup_name);
-    if (result.raw() == Object::sentinel().raw()) {
-      result ^= LookupStaticFunctionOrFieldInClass(owner, lookup_name);
-    }
-    if (result.raw() == Object::sentinel().raw()) {
-      result ^= LookupFunctionOrFieldInLibrary(this_library,
-                                               part_name,
-                                               lookup_name);
-    }
-  } else if (parts_len == 2) {
-    // Could be either library.field or class.staticfield.
-    part_name ^= lookup_parts.At(0);
-    prefix ^= this_library.LookupLocalLibraryPrefix(part_name);
-    if (prefix.IsNull()) {
-      result ^= LookupFunctionOrFieldInLibrary(this_library,
-                                               part_name,
-                                               lookup_name);
-    } else {
-      result ^= LookupFunctionOrFieldInLibraryPrefix(prefix, lookup_name);
-    }
-  } else {
-    ASSERT(parts_len == 3);
-    // Can only be library.class.staticfield.
-    part_name ^= lookup_parts.At(0);
-    prefix ^= this_library.LookupLocalLibraryPrefix(part_name);
-    if (!prefix.IsNull()) {
-      part_name ^= lookup_parts.At(1);
-      owner ^= prefix.LookupClass(part_name);
-      if (!owner.IsNull()) {
-        result ^= LookupStaticFunctionOrFieldInClass(owner, lookup_name);
-      }
-    }
-  }
-
-  // We return a tuple (list) where the first slot is a boolean indicates
-  // whether we found a field or function and the second slot contains the
-  // result. This is needed to distinguish between not finding a field and a
-  // field containing null as value.
-  const Array& result_tuple = Array::Handle(Array::New(2));
-  if (result.raw() == Object::sentinel().raw()) {
-    result_tuple.SetAt(0, Bool::False());
-    // No need to set the value.
-  } else {
-    result_tuple.SetAt(0, Bool::True());
-    result_tuple.SetAt(1, result);
-  }
-  return result_tuple.raw();
-}
-
-
 DEFINE_NATIVE_ENTRY(ClosureMirror_function, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(0));
   ASSERT(!closure.IsNull());
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index a7d8d90..b1206cd 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -456,29 +456,10 @@
     return this.invoke(#call, positionalArguments, namedArguments);
   }
 
-  InstanceMirror findInContext(Symbol name, {ifAbsent: null}) {
-    List<String> parts = _n(name).split(".").toList(growable: false);
-    if (parts.length > 3) {
-      throw new ArgumentError("Invalid symbol: ${name}");
-    }
-    List tuple = _computeFindInContext(_reflectee, parts);
-    if (tuple.length == 0) {
-      throw new UnsupportedError(
-          "ClosureMirror.findInContext not yet supported");
-    }
-    if (tuple[0]) {
-      return reflect(tuple[1]);
-    }
-    return ifAbsent == null ? null : ifAbsent();
-  }
-
   String toString() => "ClosureMirror on '${Error.safeToString(_reflectee)}'";
 
   static _computeFunction(reflectee)
       native 'ClosureMirror_function';
-
-  static _computeFindInContext(reflectee, name)
-      native 'ClosureMirror_find_in_context';
 }
 
 class _LocalClassMirror extends _LocalObjectMirror
diff --git a/runtime/platform/assert.h b/runtime/platform/assert.h
index 581a2a8..f1b2547 100644
--- a/runtime/platform/assert.h
+++ b/runtime/platform/assert.h
@@ -274,25 +274,24 @@
 // expression is true. For example, you could use it to verify the
 // size of a static array:
 //
-//   COMPILE_ASSERT(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
-//                  content_type_names_incorrect_size);
+//   COMPILE_ASSERT(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES);
 //
 // or to make sure a struct is smaller than a certain size:
 //
-//   COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);
+//   COMPILE_ASSERT(sizeof(foo) < 128);
 //
-// The second argument to the macro is the name of the variable. If
-// the expression is false, most compilers will issue a warning/error
-// containing the name of the variable.
 
 template <bool>
 struct CompileAssert {
 };
-
-#define COMPILE_ASSERT(expr, msg)                                              \
+// Macro to concatenate two tokens. The helper is need to proper expansion
+// in case an argument is a macro itself.
+#define COMPILE_ASSERT_JOIN(a, b) COMPILE_ASSERT_JOIN_HELPER(a, b)
+#define COMPILE_ASSERT_JOIN_HELPER(a, b) a##b
+#define COMPILE_ASSERT(expr)                                                   \
   DART_UNUSED typedef CompileAssert<(static_cast<bool>(expr))>                 \
-  msg[static_cast<bool>(expr) ? 1 : -1]
-
+  COMPILE_ASSERT_JOIN(CompileAssertTypeDef, __LINE__)[static_cast<bool>(expr)  \
+  ? 1 : -1]
 
 #if defined(TESTING)
 
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 7118245..5712b88 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -167,6 +167,11 @@
 #define ARCH_IS_32_BIT 1
 #define kFpuRegisterSize 8
 typedef double fpu_register_t;
+#elif defined(__aarch64__)
+#define HOST_ARCH_ARM64 1
+#define ARCH_IS_64_BIT 1
+#define kFpuRegisterSize 16
+typedef simd128_value_t fpu_register_t;
 #else
 #error Architecture was not detected as supported by Dart.
 #endif
diff --git a/runtime/vm/assembler.h b/runtime/vm/assembler.h
index 3ba58ed..4cb39d4 100644
--- a/runtime/vm/assembler.h
+++ b/runtime/vm/assembler.h
@@ -30,12 +30,8 @@
 // to be called from code generated by the assembler.
 class ExternalLabel : public ValueObject {
  public:
-  ExternalLabel(const char* name, uword address)
-      : name_(name), address_(address) {
-    ASSERT(name != NULL);
-  }
+  explicit ExternalLabel(uword address) : address_(address) {}
 
-  const char* name() const { return name_; }
   bool is_resolved() const { return address_ != 0; }
   uword address() const {
     ASSERT(is_resolved());
@@ -43,7 +39,6 @@
   }
 
  private:
-  const char* name_;
   const uword address_;
 };
 
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index 1182608..d0338a4 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -115,7 +115,7 @@
                            int set_cc,
                            Register rn,
                            Register rd,
-                           ShifterOperand so) {
+                           Operand o) {
   ASSERT(rd != kNoRegister);
   ASSERT(cond != kNoCondition);
   int32_t encoding = static_cast<int32_t>(cond) << kConditionShift |
@@ -124,7 +124,7 @@
                      set_cc << kSShift |
                      static_cast<int32_t>(rn) << kRnShift |
                      static_cast<int32_t>(rd) << kRdShift |
-                     so.encoding();
+                     o.encoding();
   Emit(encoding);
 }
 
@@ -190,13 +190,13 @@
                                    Shift opcode,
                                    Register rd,
                                    Register rm,
-                                   ShifterOperand so) {
+                                   Operand o) {
   ASSERT(cond != kNoCondition);
-  ASSERT(so.type() == 1);
+  ASSERT(o.type() == 1);
   int32_t encoding = static_cast<int32_t>(cond) << kConditionShift |
                      static_cast<int32_t>(MOV) << kOpcodeShift |
                      static_cast<int32_t>(rd) << kRdShift |
-                     so.encoding() << kShiftImmShift |
+                     o.encoding() << kShiftImmShift |
                      static_cast<int32_t>(opcode) << kShiftShift |
                      static_cast<int32_t>(rm);
   Emit(encoding);
@@ -207,13 +207,13 @@
                                   Shift opcode,
                                   Register rd,
                                   Register rm,
-                                  ShifterOperand so) {
+                                  Operand o) {
   ASSERT(cond != kNoCondition);
-  ASSERT(so.type() == 0);
+  ASSERT(o.type() == 0);
   int32_t encoding = static_cast<int32_t>(cond) << kConditionShift |
                      static_cast<int32_t>(MOV) << kOpcodeShift |
                      static_cast<int32_t>(rd) << kRdShift |
-                     so.encoding() << kShiftRegisterShift |
+                     o.encoding() << kShiftRegisterShift |
                      static_cast<int32_t>(opcode) << kShiftShift |
                      B4 |
                      static_cast<int32_t>(rm);
@@ -221,143 +221,126 @@
 }
 
 
-void Assembler::and_(Register rd, Register rn, ShifterOperand so,
-                     Condition cond) {
-  EmitType01(cond, so.type(), AND, 0, rn, rd, so);
+void Assembler::and_(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), AND, 0, rn, rd, o);
 }
 
 
-void Assembler::eor(Register rd, Register rn, ShifterOperand so,
-                    Condition cond) {
-  EmitType01(cond, so.type(), EOR, 0, rn, rd, so);
+void Assembler::eor(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), EOR, 0, rn, rd, o);
 }
 
 
-void Assembler::sub(Register rd, Register rn, ShifterOperand so,
-                    Condition cond) {
-  EmitType01(cond, so.type(), SUB, 0, rn, rd, so);
+void Assembler::sub(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), SUB, 0, rn, rd, o);
 }
 
-void Assembler::rsb(Register rd, Register rn, ShifterOperand so,
-                    Condition cond) {
-  EmitType01(cond, so.type(), RSB, 0, rn, rd, so);
+void Assembler::rsb(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), RSB, 0, rn, rd, o);
 }
 
-void Assembler::rsbs(Register rd, Register rn, ShifterOperand so,
-                     Condition cond) {
-  EmitType01(cond, so.type(), RSB, 1, rn, rd, so);
+void Assembler::rsbs(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), RSB, 1, rn, rd, o);
 }
 
 
-void Assembler::add(Register rd, Register rn, ShifterOperand so,
-                    Condition cond) {
-  EmitType01(cond, so.type(), ADD, 0, rn, rd, so);
+void Assembler::add(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), ADD, 0, rn, rd, o);
 }
 
 
-void Assembler::adds(Register rd, Register rn, ShifterOperand so,
-                     Condition cond) {
-  EmitType01(cond, so.type(), ADD, 1, rn, rd, so);
+void Assembler::adds(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), ADD, 1, rn, rd, o);
 }
 
 
-void Assembler::subs(Register rd, Register rn, ShifterOperand so,
-                     Condition cond) {
-  EmitType01(cond, so.type(), SUB, 1, rn, rd, so);
+void Assembler::subs(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), SUB, 1, rn, rd, o);
 }
 
 
-void Assembler::adc(Register rd, Register rn, ShifterOperand so,
-                    Condition cond) {
-  EmitType01(cond, so.type(), ADC, 0, rn, rd, so);
+void Assembler::adc(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), ADC, 0, rn, rd, o);
 }
 
 
-void Assembler::adcs(Register rd, Register rn, ShifterOperand so,
-                    Condition cond) {
-  EmitType01(cond, so.type(), ADC, 1, rn, rd, so);
+void Assembler::adcs(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), ADC, 1, rn, rd, o);
 }
 
 
-void Assembler::sbc(Register rd, Register rn, ShifterOperand so,
-                    Condition cond) {
-  EmitType01(cond, so.type(), SBC, 0, rn, rd, so);
+void Assembler::sbc(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), SBC, 0, rn, rd, o);
 }
 
 
-void Assembler::sbcs(Register rd, Register rn, ShifterOperand so,
-                    Condition cond) {
-  EmitType01(cond, so.type(), SBC, 1, rn, rd, so);
+void Assembler::sbcs(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), SBC, 1, rn, rd, o);
 }
 
 
-void Assembler::rsc(Register rd, Register rn, ShifterOperand so,
-                    Condition cond) {
-  EmitType01(cond, so.type(), RSC, 0, rn, rd, so);
+void Assembler::rsc(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), RSC, 0, rn, rd, o);
 }
 
 
-void Assembler::tst(Register rn, ShifterOperand so, Condition cond) {
-  EmitType01(cond, so.type(), TST, 1, rn, R0, so);
+void Assembler::tst(Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), TST, 1, rn, R0, o);
 }
 
 
-void Assembler::teq(Register rn, ShifterOperand so, Condition cond) {
-  EmitType01(cond, so.type(), TEQ, 1, rn, R0, so);
+void Assembler::teq(Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), TEQ, 1, rn, R0, o);
 }
 
 
-void Assembler::cmp(Register rn, ShifterOperand so, Condition cond) {
-  EmitType01(cond, so.type(), CMP, 1, rn, R0, so);
+void Assembler::cmp(Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), CMP, 1, rn, R0, o);
 }
 
 
-void Assembler::cmn(Register rn, ShifterOperand so, Condition cond) {
-  EmitType01(cond, so.type(), CMN, 1, rn, R0, so);
+void Assembler::cmn(Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), CMN, 1, rn, R0, o);
 }
 
 
-void Assembler::orr(Register rd, Register rn, ShifterOperand so,
-                    Condition cond) {
-  EmitType01(cond, so.type(), ORR, 0, rn, rd, so);
+void Assembler::orr(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), ORR, 0, rn, rd, o);
 }
 
 
-void Assembler::orrs(Register rd, Register rn, ShifterOperand so,
-                     Condition cond) {
-  EmitType01(cond, so.type(), ORR, 1, rn, rd, so);
+void Assembler::orrs(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), ORR, 1, rn, rd, o);
 }
 
 
-void Assembler::mov(Register rd, ShifterOperand so, Condition cond) {
-  EmitType01(cond, so.type(), MOV, 0, R0, rd, so);
+void Assembler::mov(Register rd, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), MOV, 0, R0, rd, o);
 }
 
 
-void Assembler::movs(Register rd, ShifterOperand so, Condition cond) {
-  EmitType01(cond, so.type(), MOV, 1, R0, rd, so);
+void Assembler::movs(Register rd, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), MOV, 1, R0, rd, o);
 }
 
 
-void Assembler::bic(Register rd, Register rn, ShifterOperand so,
-                    Condition cond) {
-  EmitType01(cond, so.type(), BIC, 0, rn, rd, so);
+void Assembler::bic(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), BIC, 0, rn, rd, o);
 }
 
 
-void Assembler::bics(Register rd, Register rn, ShifterOperand so,
-                     Condition cond) {
-  EmitType01(cond, so.type(), BIC, 1, rn, rd, so);
+void Assembler::bics(Register rd, Register rn, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), BIC, 1, rn, rd, o);
 }
 
 
-void Assembler::mvn(Register rd, ShifterOperand so, Condition cond) {
-  EmitType01(cond, so.type(), MVN, 0, R0, rd, so);
+void Assembler::mvn(Register rd, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), MVN, 0, R0, rd, o);
 }
 
 
-void Assembler::mvns(Register rd, ShifterOperand so, Condition cond) {
-  EmitType01(cond, so.type(), MVN, 1, R0, rd, so);
+void Assembler::mvns(Register rd, Operand o, Condition cond) {
+  EmitType01(cond, o.type(), MVN, 1, R0, rd, o);
 }
 
 
@@ -412,16 +395,14 @@
 }
 
 
-void Assembler::mul(Register rd, Register rn,
-                    Register rm, Condition cond) {
+void Assembler::mul(Register rd, Register rn, Register rm, Condition cond) {
   // Assembler registers rd, rn, rm are encoded as rn, rm, rs.
   EmitMulOp(cond, 0, R0, rd, rn, rm);
 }
 
 
 // Like mul, but sets condition flags.
-void Assembler::muls(Register rd, Register rn,
-                     Register rm, Condition cond) {
+void Assembler::muls(Register rd, Register rn, Register rm, Condition cond) {
   EmitMulOp(cond, B20, R0, rd, rn, rm);
 }
 
@@ -434,7 +415,7 @@
     EmitMulOp(cond, B21, ra, rd, rn, rm);
   } else {
     mul(IP, rn, rm, cond);
-    add(rd, ra, ShifterOperand(IP), cond);
+    add(rd, ra, Operand(IP), cond);
   }
 }
 
@@ -447,7 +428,7 @@
     EmitMulOp(cond, B22 | B21, ra, rd, rn, rm);
   } else {
     mul(IP, rn, rm, cond);
-    sub(rd, ra, ShifterOperand(IP), cond);
+    sub(rd, ra, Operand(IP), cond);
   }
 }
 
@@ -1499,7 +1480,7 @@
 
 
 void Assembler::MarkExceptionHandler(Label* label) {
-  EmitType01(AL, 1, TST, 1, PC, R0, ShifterOperand(0));
+  EmitType01(AL, 1, TST, 1, PC, R0, Operand(0));
   Label l;
   b(&l);
   EmitBranch(AL, label, false);
@@ -1527,12 +1508,12 @@
     int32_t offset_hi = offset & ~offset_mask;  // signed
     uint32_t offset_lo = offset & offset_mask;  // unsigned
     // Inline a simplified version of AddImmediate(rd, PP, offset_hi).
-    ShifterOperand shifter_op;
-    if (ShifterOperand::CanHold(offset_hi, &shifter_op)) {
-      add(rd, PP, shifter_op, cond);
+    Operand o;
+    if (Operand::CanHold(offset_hi, &o)) {
+      add(rd, PP, o, cond);
     } else {
       LoadImmediate(rd, offset_hi, cond);
-      add(rd, PP, ShifterOperand(LR), cond);
+      add(rd, PP, Operand(LR), cond);
     }
     ldr(rd, Address(rd, offset_lo), cond);
   }
@@ -1577,7 +1558,7 @@
     CompareImmediate(rn, reinterpret_cast<int32_t>(object.raw()));
   } else {
     LoadObject(IP, object);
-    cmp(rn, ShifterOperand(IP));
+    cmp(rn, Operand(IP));
   }
 }
 
@@ -1587,14 +1568,14 @@
                                            Register value,
                                            Label* no_update) {
   COMPILE_ASSERT((kNewObjectAlignmentOffset == kWordSize) &&
-                 (kOldObjectAlignmentOffset == 0), young_alignment);
+                 (kOldObjectAlignmentOffset == 0));
 
   // Write-barrier triggers if the value is in the new space (has bit set) and
   // the object is in the old space (has bit cleared).
   // To check that, we compute value & ~object and skip the write barrier
   // if the bit is not set. We can't destroy the object.
-  bic(IP, value, ShifterOperand(object));
-  tst(IP, ShifterOperand(kNewObjectAlignmentOffset));
+  bic(IP, value, Operand(object));
+  tst(IP, Operand(kNewObjectAlignmentOffset));
   b(no_update, EQ);
 }
 
@@ -1605,10 +1586,10 @@
                                       Label* no_update) {
   // For the value we are only interested in the new/old bit and the tag bit.
   // And the new bit with the tag bit. The resulting bit will be 0 for a Smi.
-  and_(IP, value, ShifterOperand(value, LSL, kObjectAlignmentLog2 - 1));
+  and_(IP, value, Operand(value, LSL, kObjectAlignmentLog2 - 1));
   // And the result with the negated space bit of the object.
-  bic(IP, IP, ShifterOperand(object));
-  tst(IP, ShifterOperand(kNewObjectAlignmentOffset));
+  bic(IP, IP, Operand(object));
+  tst(IP, Operand(kNewObjectAlignmentOffset));
   b(no_update, EQ);
 }
 
@@ -1632,7 +1613,7 @@
   }
   PushList(regs);
   if (object != R0) {
-    mov(R0, ShifterOperand(object));
+    mov(R0, Operand(object));
   }
   BranchLink(&StubCode::UpdateStoreBufferLabel());
   PopList(regs);
@@ -2171,7 +2152,7 @@
 
 void Assembler::MoveRegister(Register rd, Register rm, Condition cond) {
   if (rd != rm) {
-    mov(rd, ShifterOperand(rm), cond);
+    mov(rd, Operand(rm), cond);
   }
 }
 
@@ -2179,12 +2160,12 @@
 void Assembler::Lsl(Register rd, Register rm, uint32_t shift_imm,
                     Condition cond) {
   ASSERT(shift_imm != 0);  // Do not use Lsl if no shift is wanted.
-  mov(rd, ShifterOperand(rm, LSL, shift_imm), cond);
+  mov(rd, Operand(rm, LSL, shift_imm), cond);
 }
 
 
 void Assembler::Lsl(Register rd, Register rm, Register rs, Condition cond) {
-  mov(rd, ShifterOperand(rm, LSL, rs), cond);
+  mov(rd, Operand(rm, LSL, rs), cond);
 }
 
 
@@ -2192,12 +2173,12 @@
                     Condition cond) {
   ASSERT(shift_imm != 0);  // Do not use Lsr if no shift is wanted.
   if (shift_imm == 32) shift_imm = 0;  // Comply to UAL syntax.
-  mov(rd, ShifterOperand(rm, LSR, shift_imm), cond);
+  mov(rd, Operand(rm, LSR, shift_imm), cond);
 }
 
 
 void Assembler::Lsr(Register rd, Register rm, Register rs, Condition cond) {
-  mov(rd, ShifterOperand(rm, LSR, rs), cond);
+  mov(rd, Operand(rm, LSR, rs), cond);
 }
 
 
@@ -2205,29 +2186,29 @@
                     Condition cond) {
   ASSERT(shift_imm != 0);  // Do not use Asr if no shift is wanted.
   if (shift_imm == 32) shift_imm = 0;  // Comply to UAL syntax.
-  mov(rd, ShifterOperand(rm, ASR, shift_imm), cond);
+  mov(rd, Operand(rm, ASR, shift_imm), cond);
 }
 
 
 void Assembler::Asr(Register rd, Register rm, Register rs, Condition cond) {
-  mov(rd, ShifterOperand(rm, ASR, rs), cond);
+  mov(rd, Operand(rm, ASR, rs), cond);
 }
 
 
 void Assembler::Ror(Register rd, Register rm, uint32_t shift_imm,
                     Condition cond) {
   ASSERT(shift_imm != 0);  // Use Rrx instruction.
-  mov(rd, ShifterOperand(rm, ROR, shift_imm), cond);
+  mov(rd, Operand(rm, ROR, shift_imm), cond);
 }
 
 
 void Assembler::Ror(Register rd, Register rm, Register rs, Condition cond) {
-  mov(rd, ShifterOperand(rm, ROR, rs), cond);
+  mov(rd, Operand(rm, ROR, rs), cond);
 }
 
 
 void Assembler::Rrx(Register rd, Register rm, Condition cond) {
-  mov(rd, ShifterOperand(rm, ROR, 0), cond);
+  mov(rd, Operand(rm, ROR, 0), cond);
 }
 
 
@@ -2345,10 +2326,10 @@
     const uint32_t byte1 = (value & 0x0000ff00) >> 8;
     const uint32_t byte2 = (value & 0x00ff0000) >> 16;
     const uint32_t byte3 = (value & 0xff000000) >> 24;
-    mov(rd, ShifterOperand(4, byte3), cond);
-    orr(rd, rd, ShifterOperand(8, byte2), cond);
-    orr(rd, rd, ShifterOperand(12, byte1), cond);
-    orr(rd, rd, ShifterOperand(byte0), cond);
+    mov(rd, Operand(4, byte3), cond);
+    orr(rd, rd, Operand(8, byte2), cond);
+    orr(rd, rd, Operand(12, byte1), cond);
+    orr(rd, rd, Operand(byte0), cond);
   } else {
     ASSERT(version == ARMv7);
     const uint16_t value_low = Utils::Low16Bits(value);
@@ -2376,11 +2357,11 @@
 
 
 void Assembler::LoadImmediate(Register rd, int32_t value, Condition cond) {
-  ShifterOperand shifter_op;
-  if (ShifterOperand::CanHold(value, &shifter_op)) {
-    mov(rd, shifter_op, cond);
-  } else if (ShifterOperand::CanHold(~value, &shifter_op)) {
-    mvn(rd, shifter_op, cond);
+  Operand o;
+  if (Operand::CanHold(value, &o)) {
+    mov(rd, o, cond);
+  } else if (Operand::CanHold(~value, &o)) {
+    mvn(rd, o, cond);
   } else {
     LoadDecodableImmediate(rd, value, cond);
   }
@@ -2645,29 +2626,29 @@
                              Condition cond) {
   if (value == 0) {
     if (rd != rn) {
-      mov(rd, ShifterOperand(rn), cond);
+      mov(rd, Operand(rn), cond);
     }
     return;
   }
   // We prefer to select the shorter code sequence rather than selecting add for
   // positive values and sub for negatives ones, which would slightly improve
   // the readability of generated code for some constants.
-  ShifterOperand shifter_op;
-  if (ShifterOperand::CanHold(value, &shifter_op)) {
-    add(rd, rn, shifter_op, cond);
-  } else if (ShifterOperand::CanHold(-value, &shifter_op)) {
-    sub(rd, rn, shifter_op, cond);
+  Operand o;
+  if (Operand::CanHold(value, &o)) {
+    add(rd, rn, o, cond);
+  } else if (Operand::CanHold(-value, &o)) {
+    sub(rd, rn, o, cond);
   } else {
     ASSERT(rn != IP);
-    if (ShifterOperand::CanHold(~value, &shifter_op)) {
-      mvn(IP, shifter_op, cond);
-      add(rd, rn, ShifterOperand(IP), cond);
-    } else if (ShifterOperand::CanHold(~(-value), &shifter_op)) {
-      mvn(IP, shifter_op, cond);
-      sub(rd, rn, ShifterOperand(IP), cond);
+    if (Operand::CanHold(~value, &o)) {
+      mvn(IP, o, cond);
+      add(rd, rn, Operand(IP), cond);
+    } else if (Operand::CanHold(~(-value), &o)) {
+      mvn(IP, o, cond);
+      sub(rd, rn, Operand(IP), cond);
     } else {
       LoadDecodableImmediate(IP, value, cond);
-      add(rd, rn, ShifterOperand(IP), cond);
+      add(rd, rn, Operand(IP), cond);
     }
   }
 }
@@ -2675,25 +2656,25 @@
 
 void Assembler::AddImmediateSetFlags(Register rd, Register rn, int32_t value,
                                     Condition cond) {
-  ShifterOperand shifter_op;
-  if (ShifterOperand::CanHold(value, &shifter_op)) {
+  Operand o;
+  if (Operand::CanHold(value, &o)) {
     // Handles value == kMinInt32.
-    adds(rd, rn, shifter_op, cond);
-  } else if (ShifterOperand::CanHold(-value, &shifter_op)) {
+    adds(rd, rn, o, cond);
+  } else if (Operand::CanHold(-value, &o)) {
     ASSERT(value != kMinInt32);  // Would cause erroneous overflow detection.
-    subs(rd, rn, shifter_op, cond);
+    subs(rd, rn, o, cond);
   } else {
     ASSERT(rn != IP);
-    if (ShifterOperand::CanHold(~value, &shifter_op)) {
-      mvn(IP, shifter_op, cond);
-      adds(rd, rn, ShifterOperand(IP), cond);
-    } else if (ShifterOperand::CanHold(~(-value), &shifter_op)) {
+    if (Operand::CanHold(~value, &o)) {
+      mvn(IP, o, cond);
+      adds(rd, rn, Operand(IP), cond);
+    } else if (Operand::CanHold(~(-value), &o)) {
       ASSERT(value != kMinInt32);  // Would cause erroneous overflow detection.
-      mvn(IP, shifter_op, cond);
-      subs(rd, rn, ShifterOperand(IP), cond);
+      mvn(IP, o, cond);
+      subs(rd, rn, Operand(IP), cond);
     } else {
       LoadDecodableImmediate(IP, value, cond);
-      adds(rd, rn, ShifterOperand(IP), cond);
+      adds(rd, rn, Operand(IP), cond);
     }
   }
 }
@@ -2701,25 +2682,25 @@
 
 void Assembler::SubImmediateSetFlags(Register rd, Register rn, int32_t value,
                                     Condition cond) {
-  ShifterOperand shifter_op;
-  if (ShifterOperand::CanHold(value, &shifter_op)) {
+  Operand o;
+  if (Operand::CanHold(value, &o)) {
     // Handles value == kMinInt32.
-    subs(rd, rn, shifter_op, cond);
-  } else if (ShifterOperand::CanHold(-value, &shifter_op)) {
+    subs(rd, rn, o, cond);
+  } else if (Operand::CanHold(-value, &o)) {
     ASSERT(value != kMinInt32);  // Would cause erroneous overflow detection.
-    adds(rd, rn, shifter_op, cond);
+    adds(rd, rn, o, cond);
   } else {
     ASSERT(rn != IP);
-    if (ShifterOperand::CanHold(~value, &shifter_op)) {
-      mvn(IP, shifter_op, cond);
-      subs(rd, rn, ShifterOperand(IP), cond);
-    } else if (ShifterOperand::CanHold(~(-value), &shifter_op)) {
+    if (Operand::CanHold(~value, &o)) {
+      mvn(IP, o, cond);
+      subs(rd, rn, Operand(IP), cond);
+    } else if (Operand::CanHold(~(-value), &o)) {
       ASSERT(value != kMinInt32);  // Would cause erroneous overflow detection.
-      mvn(IP, shifter_op, cond);
-      adds(rd, rn, ShifterOperand(IP), cond);
+      mvn(IP, o, cond);
+      adds(rd, rn, Operand(IP), cond);
     } else {
       LoadDecodableImmediate(IP, value, cond);
-      subs(rd, rn, ShifterOperand(IP), cond);
+      subs(rd, rn, Operand(IP), cond);
     }
   }
 }
@@ -2727,35 +2708,35 @@
 
 void Assembler::AndImmediate(Register rd, Register rs, int32_t imm,
                              Condition cond) {
-  ShifterOperand op;
-  if (ShifterOperand::CanHold(imm, &op)) {
-    and_(rd, rs, ShifterOperand(op), cond);
+  Operand o;
+  if (Operand::CanHold(imm, &o)) {
+    and_(rd, rs, Operand(o), cond);
   } else {
     LoadImmediate(TMP, imm, cond);
-    and_(rd, rs, ShifterOperand(TMP), cond);
+    and_(rd, rs, Operand(TMP), cond);
   }
 }
 
 
 void Assembler::CompareImmediate(Register rn, int32_t value, Condition cond) {
-  ShifterOperand shifter_op;
-  if (ShifterOperand::CanHold(value, &shifter_op)) {
-    cmp(rn, shifter_op, cond);
+  Operand o;
+  if (Operand::CanHold(value, &o)) {
+    cmp(rn, o, cond);
   } else {
     ASSERT(rn != IP);
     LoadImmediate(IP, value, cond);
-    cmp(rn, ShifterOperand(IP), cond);
+    cmp(rn, Operand(IP), cond);
   }
 }
 
 
 void Assembler::TestImmediate(Register rn, int32_t imm, Condition cond) {
-  ShifterOperand shifter_op;
-  if (ShifterOperand::CanHold(imm, &shifter_op)) {
-    tst(rn, shifter_op, cond);
+  Operand o;
+  if (Operand::CanHold(imm, &o)) {
+    tst(rn, o, cond);
   } else {
     LoadImmediate(IP, imm);
-    tst(rn, ShifterOperand(IP), cond);
+    tst(rn, Operand(IP), cond);
   }
 }
 
@@ -2797,7 +2778,7 @@
   // Both positive.
   LoadImmediate(tmp, INT_MAX);
   IntegerDivide(tmp, tmp, left, dtmp0, dtmp1);
-  cmp(tmp, ShifterOperand(right));
+  cmp(tmp, Operand(right));
   b(overflow, LT);
   b(&done);
 
@@ -2805,7 +2786,7 @@
   Bind(&left_pos_right_neg);
   LoadImmediate(tmp, INT_MIN);
   IntegerDivide(tmp, tmp, left, dtmp0, dtmp1);
-  cmp(tmp, ShifterOperand(right));
+  cmp(tmp, Operand(right));
   b(overflow, GT);
   b(&done);
 
@@ -2817,7 +2798,7 @@
   // both negative.
   LoadImmediate(tmp, INT_MAX);
   IntegerDivide(tmp, tmp, left, dtmp0, dtmp1);
-  cmp(tmp, ShifterOperand(right));
+  cmp(tmp, Operand(right));
   b(overflow, GT);
   b(&done);
 
@@ -2825,7 +2806,7 @@
   Bind(&left_neg_right_pos);
   LoadImmediate(tmp, INT_MIN);
   IntegerDivide(tmp, tmp, right, dtmp0, dtmp1);
-  cmp(tmp, ShifterOperand(left));
+  cmp(tmp, Operand(left));
   b(overflow, GT);
 
   Bind(&done);
@@ -2850,7 +2831,7 @@
   PushList(regs);
   if ((regs & (1 << FP)) != 0) {
     // Set FP to the saved previous FP.
-    add(FP, SP, ShifterOperand(4 * NumRegsBelowFP(regs)));
+    add(FP, SP, Operand(4 * NumRegsBelowFP(regs)));
   }
   AddImmediate(SP, -frame_size);
 }
@@ -2860,7 +2841,7 @@
   ASSERT((regs & (1 << PC)) == 0);  // Must not pop PC.
   if ((regs & (1 << FP)) != 0) {
     // Use FP to set SP.
-    sub(SP, FP, ShifterOperand(4 * NumRegsBelowFP(regs)));
+    sub(SP, FP, Operand(4 * NumRegsBelowFP(regs)));
   }
   PopList(regs);
 }
@@ -2876,7 +2857,7 @@
   // the C++ world.
   AddImmediate(SP, -frame_space);
   if (OS::ActivationFrameAlignment() > 1) {
-    bic(SP, SP, ShifterOperand(OS::ActivationFrameAlignment() - 1));
+    bic(SP, SP, Operand(OS::ActivationFrameAlignment() - 1));
   }
 }
 
@@ -2970,7 +2951,7 @@
   const intptr_t offset = CodeSize();
 
   Comment("EnterOsrFrame");
-  mov(IP, ShifterOperand(PC));
+  mov(IP, Operand(PC));
 
   AddImmediate(IP, -offset);
   str(IP, Address(FP, kPcMarkerSlotFromFp * kWordSize));
@@ -2991,8 +2972,8 @@
 
 void Assembler::EnterStubFrame(bool load_pp) {
   // Push 0 as saved PC for stub frames.
-  mov(IP, ShifterOperand(LR));
-  mov(LR, ShifterOperand(0));
+  mov(IP, Operand(LR));
+  mov(LR, Operand(0));
   RegList regs = (1 << PP) | (1 << FP) | (1 << IP) | (1 << LR);
   EnterFrame(regs, 0);
   if (load_pp) {
@@ -3071,7 +3052,7 @@
     AddImmediate(TMP, 1);
     str(TMP, count_address);
     ldr(TMP, size_address);
-    add(TMP, TMP, ShifterOperand(size_reg));
+    add(TMP, TMP, Operand(size_reg));
     str(TMP, size_address);
   } else {
     ASSERT(temp_reg != kNoRegister);
@@ -3089,7 +3070,7 @@
     AddImmediate(TMP, 1);
     str(TMP, Address(temp_reg, count_field_offset));
     ldr(TMP, Address(temp_reg, size_field_offset));
-    add(TMP, TMP, ShifterOperand(size_reg));
+    add(TMP, TMP, Operand(size_reg));
     str(TMP, Address(temp_reg, size_field_offset));
   }
 }
@@ -3110,7 +3091,7 @@
     // instance_reg: potential next object start.
     LoadImmediate(IP, heap->EndAddress());
     ldr(IP, Address(IP, 0));
-    cmp(IP, ShifterOperand(instance_reg));
+    cmp(IP, Operand(instance_reg));
     // fail if heap end unsigned less than or equal to instance_reg.
     b(failure, LS);
 
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 44e06f3..127b1f8 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -65,44 +65,44 @@
 
 
 // Encodes Addressing Mode 1 - Data-processing operands.
-class ShifterOperand : public ValueObject {
+class Operand : public ValueObject {
  public:
   // Data-processing operands - Uninitialized.
-  ShifterOperand() : type_(-1), encoding_(-1) { }
+  Operand() : type_(-1), encoding_(-1) { }
 
   // Data-processing operands - Copy constructor.
-  ShifterOperand(const ShifterOperand& other)
+  Operand(const Operand& other)
       : ValueObject(), type_(other.type_), encoding_(other.encoding_) { }
 
   // Data-processing operands - Assignment operator.
-  ShifterOperand& operator=(const ShifterOperand& other) {
+  Operand& operator=(const Operand& other) {
     type_ = other.type_;
     encoding_ = other.encoding_;
     return *this;
   }
 
   // Data-processing operands - Immediate.
-  explicit ShifterOperand(uint32_t immediate) {
+  explicit Operand(uint32_t immediate) {
     ASSERT(immediate < (1 << kImmed8Bits));
     type_ = 1;
     encoding_ = immediate;
   }
 
   // Data-processing operands - Rotated immediate.
-  ShifterOperand(uint32_t rotate, uint32_t immed8) {
+  Operand(uint32_t rotate, uint32_t immed8) {
     ASSERT((rotate < (1 << kRotateBits)) && (immed8 < (1 << kImmed8Bits)));
     type_ = 1;
     encoding_ = (rotate << kRotateShift) | (immed8 << kImmed8Shift);
   }
 
   // Data-processing operands - Register.
-  explicit ShifterOperand(Register rm) {
+  explicit Operand(Register rm) {
     type_ = 0;
     encoding_ = static_cast<uint32_t>(rm);
   }
 
   // Data-processing operands - Logical shift/rotate by immediate.
-  ShifterOperand(Register rm, Shift shift, uint32_t shift_imm) {
+  Operand(Register rm, Shift shift, uint32_t shift_imm) {
     ASSERT(shift_imm < (1 << kShiftImmBits));
     type_ = 0;
     encoding_ = shift_imm << kShiftImmShift |
@@ -111,26 +111,26 @@
   }
 
   // Data-processing operands - Logical shift/rotate by register.
-  ShifterOperand(Register rm, Shift shift, Register rs) {
+  Operand(Register rm, Shift shift, Register rs) {
     type_ = 0;
     encoding_ = static_cast<uint32_t>(rs) << kShiftRegisterShift |
                 static_cast<uint32_t>(shift) << kShiftShift | (1 << 4) |
                 static_cast<uint32_t>(rm);
   }
 
-  static bool CanHold(uint32_t immediate, ShifterOperand* shifter_op) {
+  static bool CanHold(uint32_t immediate, Operand* o) {
     // Avoid the more expensive test for frequent small immediate values.
     if (immediate < (1 << kImmed8Bits)) {
-      shifter_op->type_ = 1;
-      shifter_op->encoding_ = (0 << kRotateShift) | (immediate << kImmed8Shift);
+      o->type_ = 1;
+      o->encoding_ = (0 << kRotateShift) | (immediate << kImmed8Shift);
       return true;
     }
     // Note that immediate must be unsigned for the test to work correctly.
     for (int rot = 0; rot < 16; rot++) {
       uint32_t imm8 = (immediate << 2*rot) | (immediate >> (32 - 2*rot));
       if (imm8 < (1 << kImmed8Bits)) {
-        shifter_op->type_ = 1;
-        shifter_op->encoding_ = (rot << kRotateShift) | (imm8 << kImmed8Shift);
+        o->type_ = 1;
+        o->encoding_ = (rot << kRotateShift) | (imm8 << kImmed8Shift);
         return true;
       }
     }
@@ -232,14 +232,14 @@
 
   Address(Register rn, Register rm,
           Shift shift = LSL, uint32_t shift_imm = 0, Mode am = Offset) {
-    ShifterOperand so(rm, shift, shift_imm);
+    Operand o(rm, shift, shift_imm);
 
     if ((shift == LSL) && (shift_imm == 0)) {
       kind_ = IndexRegister;
     } else {
       kind_ = ScaledIndexRegister;
     }
-    encoding_ = so.encoding() | am | (static_cast<uint32_t>(rn) << kRnShift);
+    encoding_ = o.encoding() | am | (static_cast<uint32_t>(rn) << kRnShift);
   }
 
   static OperandSize OperandSizeFor(intptr_t cid);
@@ -342,49 +342,49 @@
   static const char* FpuRegisterName(FpuRegister reg);
 
   // Data-processing instructions.
-  void and_(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void and_(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void eor(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void eor(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void sub(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
-  void subs(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void sub(Register rd, Register rn, Operand o, Condition cond = AL);
+  void subs(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void rsb(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
-  void rsbs(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void rsb(Register rd, Register rn, Operand o, Condition cond = AL);
+  void rsbs(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void add(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void add(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void adds(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void adds(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void adc(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void adc(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void adcs(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void adcs(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void sbc(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void sbc(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void sbcs(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void sbcs(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void rsc(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void rsc(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void tst(Register rn, ShifterOperand so, Condition cond = AL);
+  void tst(Register rn, Operand o, Condition cond = AL);
 
-  void teq(Register rn, ShifterOperand so, Condition cond = AL);
+  void teq(Register rn, Operand o, Condition cond = AL);
 
-  void cmp(Register rn, ShifterOperand so, Condition cond = AL);
+  void cmp(Register rn, Operand o, Condition cond = AL);
 
-  void cmn(Register rn, ShifterOperand so, Condition cond = AL);
+  void cmn(Register rn, Operand o, Condition cond = AL);
 
-  void orr(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
-  void orrs(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void orr(Register rd, Register rn, Operand o, Condition cond = AL);
+  void orrs(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void mov(Register rd, ShifterOperand so, Condition cond = AL);
-  void movs(Register rd, ShifterOperand so, Condition cond = AL);
+  void mov(Register rd, Operand o, Condition cond = AL);
+  void movs(Register rd, Operand o, Condition cond = AL);
 
-  void bic(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
-  void bics(Register rd, Register rn, ShifterOperand so, Condition cond = AL);
+  void bic(Register rd, Register rn, Operand o, Condition cond = AL);
+  void bics(Register rd, Register rn, Operand o, Condition cond = AL);
 
-  void mvn(Register rd, ShifterOperand so, Condition cond = AL);
-  void mvns(Register rd, ShifterOperand so, Condition cond = AL);
+  void mvn(Register rd, Operand o, Condition cond = AL);
+  void mvns(Register rd, Operand o, Condition cond = AL);
 
   // Miscellaneous data-processing instructions.
   void clz(Register rd, Register rm, Condition cond = AL);
@@ -722,6 +722,10 @@
     Asr(reg, reg, kSmiTagSize, cond);
   }
 
+  void SmiUntag(Register dst, Register src, Condition cond = AL) {
+    Asr(dst, src, kSmiTagSize, cond);
+  }
+
   // Function frame setup and tear down.
   void EnterFrame(RegList regs, intptr_t frame_space);
   void LeaveFrame(RegList regs);
@@ -819,7 +823,7 @@
                   int set_cc,
                   Register rn,
                   Register rd,
-                  ShifterOperand so);
+                  Operand o);
 
   void EmitType5(Condition cond, int32_t offset, bool link);
 
@@ -844,13 +848,13 @@
                           Shift opcode,
                           Register rd,
                           Register rm,
-                          ShifterOperand so);
+                          Operand o);
 
   void EmitShiftRegister(Condition cond,
                          Shift opcode,
                          Register rd,
                          Register rm,
-                         ShifterOperand so);
+                         Operand o);
 
   void EmitMulOp(Condition cond,
                  int32_t opcode,
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index 7db683d..07ab448 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -877,13 +877,46 @@
 }
 
 
+void Assembler::VRecps(VRegister vd, VRegister vn) {
+  ASSERT(vn != VTMP);
+  ASSERT(vd != VTMP);
+
+  // Reciprocal estimate.
+  vrecpes(vd, vn);
+  // 2 Newton-Raphson steps.
+  vrecpss(VTMP, vn, vd);
+  vmuls(vd, vd, VTMP);
+  vrecpss(VTMP, vn, vd);
+  vmuls(vd, vd, VTMP);
+}
+
+
+void Assembler::VRSqrts(VRegister vd, VRegister vn) {
+  ASSERT(vd != VTMP);
+  ASSERT(vn != VTMP);
+
+  // Reciprocal square root estimate.
+  vrsqrtes(vd, vn);
+  // 2 Newton-Raphson steps. xn+1 = xn * (3 - V1*xn^2) / 2.
+  // First step.
+  vmuls(VTMP, vd, vd);  // VTMP <- xn^2
+  vrsqrtss(VTMP, vn, VTMP);  // VTMP <- (3 - V1*VTMP) / 2.
+  vmuls(vd, vd, VTMP);  // xn+1 <- xn * VTMP
+  // Second step.
+  vmuls(VTMP, vd, vd);
+  vrsqrtss(VTMP, vn, VTMP);
+  vmuls(vd, vd, VTMP);
+}
+
+
+
 // Store into object.
 // Preserves object and value registers.
 void Assembler::StoreIntoObjectFilterNoSmi(Register object,
                                            Register value,
                                            Label* no_update) {
   COMPILE_ASSERT((kNewObjectAlignmentOffset == kWordSize) &&
-                 (kOldObjectAlignmentOffset == 0), young_alignment);
+                 (kOldObjectAlignmentOffset == 0));
 
   // Write-barrier triggers if the value is in the new space (has bit set) and
   // the object is in the old space (has bit cleared).
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index 74d9da1..9529137 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -183,6 +183,51 @@
     base_ = crn;
   }
 
+  static OperandSize OperandSizeFor(intptr_t cid) {
+    switch (cid) {
+      case kArrayCid:
+      case kImmutableArrayCid:
+        return kWord;
+      case kOneByteStringCid:
+        return kByte;
+      case kTwoByteStringCid:
+        return kHalfword;
+      case kTypedDataInt8ArrayCid:
+        return kByte;
+      case kTypedDataUint8ArrayCid:
+      case kTypedDataUint8ClampedArrayCid:
+      case kExternalTypedDataUint8ArrayCid:
+      case kExternalTypedDataUint8ClampedArrayCid:
+        return kUnsignedByte;
+      case kTypedDataInt16ArrayCid:
+        return kHalfword;
+      case kTypedDataUint16ArrayCid:
+        return kUnsignedHalfword;
+      case kTypedDataInt32ArrayCid:
+        return kWord;
+      case kTypedDataUint32ArrayCid:
+        return kUnsignedWord;
+      case kTypedDataInt64ArrayCid:
+      case kTypedDataUint64ArrayCid:
+        UNREACHABLE();
+        return kByte;
+      case kTypedDataFloat32ArrayCid:
+        return kSWord;
+      case kTypedDataFloat64ArrayCid:
+        return kDWord;
+      case kTypedDataFloat32x4ArrayCid:
+      case kTypedDataInt32x4ArrayCid:
+      case kTypedDataFloat64x2ArrayCid:
+        return kQWord;
+      case kTypedDataInt8ArrayViewCid:
+        UNREACHABLE();
+        return kByte;
+      default:
+        UNREACHABLE();
+        return kByte;
+    }
+  }
+
  private:
   uint32_t encoding() const { return encoding_; }
   AddressType type() const { return type_; }
@@ -567,10 +612,10 @@
 
   // Conditional select.
   void csel(Register rd, Register rn, Register rm, Condition cond) {
-    EmitCoditionalSelect(CSEL, rd, rn, rm, cond, kDoubleWord);
+    EmitConditionalSelect(CSEL, rd, rn, rm, cond, kDoubleWord);
   }
   void csinc(Register rd, Register rn, Register rm, Condition cond) {
-    EmitCoditionalSelect(CSINC, rd, rn, rm, cond, kDoubleWord);
+    EmitConditionalSelect(CSINC, rd, rn, rm, cond, kDoubleWord);
   }
   void cinc(Register rd, Register rn, Condition cond) {
     csinc(rd, rn, rn, InvertCondition(cond));
@@ -578,6 +623,15 @@
   void cset(Register rd, Condition cond) {
     csinc(rd, ZR, ZR, InvertCondition(cond));
   }
+  void csinv(Register rd, Register rn, Register rm, Condition cond) {
+    EmitConditionalSelect(CSINV, rd, rn, rm, cond, kDoubleWord);
+  }
+  void cinv(Register rd, Register rn, Condition cond) {
+    csinv(rd, rn, rn, InvertCondition(cond));
+  }
+  void csetm(Register rd, Condition cond) {
+    csinv(rd, ZR, ZR, InvertCondition(cond));
+  }
 
   // Comparison.
   // rn cmp o.
@@ -777,6 +831,42 @@
   void vdivd(VRegister vd, VRegister vn, VRegister vm) {
     EmitSIMDThreeSameOp(VDIVD, vd, vn, vm);
   }
+  void vceqs(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VCEQS, vd, vn, vm);
+  }
+  void vceqd(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VCEQD, vd, vn, vm);
+  }
+  void vcgts(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VCGTS, vd, vn, vm);
+  }
+  void vcgtd(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VCGTD, vd, vn, vm);
+  }
+  void vcges(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VCGES, vd, vn, vm);
+  }
+  void vcged(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VCGED, vd, vn, vm);
+  }
+  void vmins(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VMINS, vd, vn, vm);
+  }
+  void vmind(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VMIND, vd, vn, vm);
+  }
+  void vmaxs(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VMAXS, vd, vn, vm);
+  }
+  void vmaxd(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VMAXD, vd, vn, vm);
+  }
+  void vrecpss(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VRECPSS, vd, vn, vm);
+  }
+  void vrsqrtss(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VRSQRTSS, vd, vn, vm);
+  }
   void vnot(VRegister vd, VRegister vn) {
     EmitSIMDTwoRegOp(VNOT, vd, vn);
   }
@@ -792,6 +882,18 @@
   void vnegd(VRegister vd, VRegister vn) {
     EmitSIMDTwoRegOp(VNEGD, vd, vn);
   }
+  void vsqrts(VRegister vd, VRegister vn) {
+    EmitSIMDTwoRegOp(VSQRTS, vd, vn);
+  }
+  void vsqrtd(VRegister vd, VRegister vn) {
+    EmitSIMDTwoRegOp(VSQRTD, vd, vn);
+  }
+  void vrecpes(VRegister vd, VRegister vn) {
+    EmitSIMDTwoRegOp(VRECPES, vd, vn);
+  }
+  void vrsqrtes(VRegister vd, VRegister vn) {
+    EmitSIMDTwoRegOp(VRSQRTES, vd, vn);
+  }
   void vdupw(VRegister vd, Register rn) {
     const VRegister vn = static_cast<VRegister>(rn);
     EmitSIMDCopyOp(VDUPI, vd, vn, kWord, 0, 0);
@@ -911,9 +1013,15 @@
     add(rd, ZR, Operand(rn, ASR, shift));
   }
 
+  void VRecps(VRegister vd, VRegister vn);
+  void VRSqrts(VRegister vd, VRegister vn);
+
   void SmiUntag(Register reg) {
     Asr(reg, reg, kSmiTagSize);
   }
+  void SmiUntag(Register dst, Register src) {
+    Asr(dst, src, kSmiTagSize);
+  }
   void SmiTag(Register reg) {
     Lsl(reg, reg, kSmiTagSize);
   }
@@ -1453,9 +1561,9 @@
     Emit(encoding);
   }
 
-  void EmitCoditionalSelect(ConditionalSelectOp op,
-                            Register rd, Register rn, Register rm,
-                            Condition cond, OperandSize sz) {
+  void EmitConditionalSelect(ConditionalSelectOp op,
+                             Register rd, Register rn, Register rm,
+                             Condition cond, OperandSize sz) {
     ASSERT((rd != SP) && (rn != SP) && (rm != SP));
     ASSERT((sz == kDoubleWord) || (sz == kWord) || (sz == kUnsignedWord));
     const Register crd = ConcreteRegister(rd);
diff --git a/runtime/vm/assembler_arm64_test.cc b/runtime/vm/assembler_arm64_test.cc
index 92134a3..e629a1f 100644
--- a/runtime/vm/assembler_arm64_test.cc
+++ b/runtime/vm/assembler_arm64_test.cc
@@ -1498,6 +1498,36 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(CsinvFalse, assembler) {
+  __ LoadImmediate(R1, 42, kNoRegister);
+  __ LoadImmediate(R2, 1234, kNoRegister);
+  __ CompareRegisters(R1, R2);
+  __ csinv(R0, R2, R1, GE);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(CsinvFalse, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(~42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(CsinvTrue, assembler) {
+  __ LoadImmediate(R1, 42, kNoRegister);
+  __ LoadImmediate(R2, 1234, kNoRegister);
+  __ CompareRegisters(R1, R2);
+  __ csinv(R0, R2, R1, LT);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(CsinvTrue, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
 // Floating point move immediate, to/from integer register.
 ASSEMBLER_TEST_GENERATE(Fmovdi, assembler) {
   __ LoadDImmediate(V0, 1.0, kNoPP);
@@ -2602,6 +2632,575 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(Vceqs, assembler) {
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ LoadDImmediate(V1, -42.0, kNoPP);
+
+  __ fcvtsd(V0, V0);
+  __ fcvtsd(V1, V1);
+
+  __ vdups(V2, V0, 0);
+  __ vinss(V3, 0, V0, 0);
+  __ vinss(V3, 1, V1, 0);
+  __ vinss(V3, 2, V0, 0);
+  __ vinss(V3, 3, V1, 0);
+
+  __ vceqs(V4, V2, V3);
+
+  __ vmovrs(R1, V4, 0);
+  __ vmovrs(R2, V4, 1);
+  __ vmovrs(R3, V4, 2);
+  __ vmovrs(R4, V4, 3);
+
+  __ addw(R0, R1, Operand(R2));
+  __ addw(R0, R0, Operand(R3));
+  __ addw(R0, R0, Operand(R4));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vceqs, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vceqd, assembler) {
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ LoadDImmediate(V1, -42.0, kNoPP);
+
+  __ vdupd(V2, V0, 0);
+  __ vinsd(V3, 0, V0, 0);
+  __ vinsd(V3, 1, V1, 0);
+
+  __ vceqd(V4, V2, V3);
+
+  __ vmovrd(R1, V4, 0);
+  __ vmovrd(R2, V4, 1);
+
+  __ add(R0, R1, Operand(R2));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vceqd, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vcgts, assembler) {
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ LoadDImmediate(V1, -42.0, kNoPP);
+
+  __ fcvtsd(V0, V0);
+  __ fcvtsd(V1, V1);
+
+  __ vdups(V2, V0, 0);
+  __ vinss(V3, 0, V0, 0);
+  __ vinss(V3, 1, V1, 0);
+  __ vinss(V3, 2, V0, 0);
+  __ vinss(V3, 3, V1, 0);
+
+  __ vcgts(V4, V2, V3);
+
+  __ vmovrs(R1, V4, 0);
+  __ vmovrs(R2, V4, 1);
+  __ vmovrs(R3, V4, 2);
+  __ vmovrs(R4, V4, 3);
+
+  __ addw(R0, R1, Operand(R2));
+  __ addw(R0, R0, Operand(R3));
+  __ addw(R0, R0, Operand(R4));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vcgts, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vcgtd, assembler) {
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ LoadDImmediate(V1, -42.0, kNoPP);
+
+  __ vdupd(V2, V0, 0);
+  __ vinsd(V3, 0, V0, 0);
+  __ vinsd(V3, 1, V1, 0);
+
+  __ vcgtd(V4, V2, V3);
+
+  __ vmovrd(R1, V4, 0);
+  __ vmovrd(R2, V4, 1);
+
+  __ add(R0, R1, Operand(R2));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vcgtd, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vcges, assembler) {
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ LoadDImmediate(V1, 43.0, kNoPP);
+
+  __ fcvtsd(V0, V0);
+  __ fcvtsd(V1, V1);
+
+  __ vdups(V2, V0, 0);
+  __ vinss(V3, 0, V0, 0);
+  __ vinss(V3, 1, V1, 0);
+  __ vinss(V3, 2, V0, 0);
+  __ vinss(V3, 3, V1, 0);
+
+  __ vcges(V4, V2, V3);
+
+  __ vmovrs(R1, V4, 0);
+  __ vmovrs(R2, V4, 1);
+  __ vmovrs(R3, V4, 2);
+  __ vmovrs(R4, V4, 3);
+
+  __ addw(R0, R1, Operand(R2));
+  __ addw(R0, R0, Operand(R3));
+  __ addw(R0, R0, Operand(R4));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vcges, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vcged, assembler) {
+  __ LoadDImmediate(V0, 42.0, kNoPP);
+  __ LoadDImmediate(V1, 43.0, kNoPP);
+
+  __ vdupd(V2, V0, 0);
+  __ vinsd(V3, 0, V0, 0);
+  __ vinsd(V3, 1, V1, 0);
+
+  __ vcged(V4, V2, V3);
+
+  __ vmovrd(R1, V4, 0);
+  __ vmovrd(R2, V4, 1);
+
+  __ add(R0, R1, Operand(R2));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vcged, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vmaxs, assembler) {
+  __ LoadDImmediate(V0, 10.5, kNoPP);
+  __ LoadDImmediate(V1, 10.0, kNoPP);
+
+  __ fcvtsd(V0, V0);
+  __ fcvtsd(V1, V1);
+
+  __ vdups(V2, V0, 0);
+  __ vinss(V3, 0, V0, 0);
+  __ vinss(V3, 1, V1, 0);
+  __ vinss(V3, 2, V0, 0);
+  __ vinss(V3, 3, V1, 0);
+
+  __ vmaxs(V4, V2, V3);
+
+  __ vinss(V0, 0, V4, 0);
+  __ vinss(V1, 0, V4, 1);
+  __ vinss(V2, 0, V4, 2);
+  __ vinss(V3, 0, V4, 3);
+
+  __ fcvtds(V0, V0);
+  __ fcvtds(V1, V1);
+  __ fcvtds(V2, V2);
+  __ fcvtds(V3, V3);
+
+  __ faddd(V0, V0, V1);
+  __ faddd(V0, V0, V2);
+  __ faddd(V0, V0, V3);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vmaxs, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vmaxd, assembler) {
+  __ LoadDImmediate(V0, 21.0, kNoPP);
+  __ LoadDImmediate(V1, 20.5, kNoPP);
+
+  __ vdupd(V2, V0, 0);
+  __ vinsd(V3, 0, V0, 0);
+  __ vinsd(V3, 1, V1, 0);
+
+  __ vmaxd(V4, V2, V3);
+
+  __ vinsd(V0, 0, V4, 0);
+  __ vinsd(V1, 0, V4, 1);
+
+  __ faddd(V0, V0, V1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vmaxd, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vmins, assembler) {
+  __ LoadDImmediate(V0, 10.5, kNoPP);
+  __ LoadDImmediate(V1, 11.0, kNoPP);
+
+  __ fcvtsd(V0, V0);
+  __ fcvtsd(V1, V1);
+
+  __ vdups(V2, V0, 0);
+  __ vinss(V3, 0, V0, 0);
+  __ vinss(V3, 1, V1, 0);
+  __ vinss(V3, 2, V0, 0);
+  __ vinss(V3, 3, V1, 0);
+
+  __ vmins(V4, V2, V3);
+
+  __ vinss(V0, 0, V4, 0);
+  __ vinss(V1, 0, V4, 1);
+  __ vinss(V2, 0, V4, 2);
+  __ vinss(V3, 0, V4, 3);
+
+  __ fcvtds(V0, V0);
+  __ fcvtds(V1, V1);
+  __ fcvtds(V2, V2);
+  __ fcvtds(V3, V3);
+
+  __ faddd(V0, V0, V1);
+  __ faddd(V0, V0, V2);
+  __ faddd(V0, V0, V3);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vmins, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vmind, assembler) {
+  __ LoadDImmediate(V0, 21.0, kNoPP);
+  __ LoadDImmediate(V1, 21.5, kNoPP);
+
+  __ vdupd(V2, V0, 0);
+  __ vinsd(V3, 0, V0, 0);
+  __ vinsd(V3, 1, V1, 0);
+
+  __ vmind(V4, V2, V3);
+
+  __ vinsd(V0, 0, V4, 0);
+  __ vinsd(V1, 0, V4, 1);
+
+  __ faddd(V0, V0, V1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vmind, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vsqrts, assembler) {
+  __ LoadDImmediate(V0, 64.0, kNoPP);
+  __ LoadDImmediate(V1, 49.0, kNoPP);
+
+  __ fcvtsd(V0, V0);
+  __ fcvtsd(V1, V1);
+
+  __ veor(V3, V3, V3);
+  __ vinss(V3, 1, V0, 0);
+  __ vinss(V3, 3, V1, 0);
+
+  __ vsqrts(V4, V3);
+
+  __ vinss(V5, 0, V4, 1);
+  __ vinss(V6, 0, V4, 3);
+
+  __ fcvtds(V5, V5);
+  __ fcvtds(V6, V6);
+
+  __ faddd(V0, V5, V6);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vsqrts, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vsqrtd, assembler) {
+  __ LoadDImmediate(V0, 64.0, kNoPP);
+  __ LoadDImmediate(V1, 49.0, kNoPP);
+
+  __ vinsd(V3, 0, V0, 0);
+  __ vinsd(V3, 1, V1, 0);
+
+  __ vsqrtd(V4, V3);
+
+  __ vinsd(V5, 0, V4, 0);
+  __ vinsd(V6, 0, V4, 1);
+
+  __ faddd(V0, V5, V6);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vsqrtd, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+// This is the same function as in the Simulator.
+static float arm_recip_estimate(float a) {
+  // From the ARM Architecture Reference Manual A2-85.
+  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
+  else if (a == 0.0) return INFINITY;
+  else if (isnan(a)) return a;
+
+  uint32_t a_bits = bit_cast<uint32_t, float>(a);
+  // scaled = '0011 1111 1110' : a<22:0> : Zeros(29)
+  uint64_t scaled = (static_cast<uint64_t>(0x3fe) << 52) |
+                    ((static_cast<uint64_t>(a_bits) & 0x7fffff) << 29);
+  // result_exp = 253 - UInt(a<30:23>)
+  int32_t result_exp = 253 - ((a_bits >> 23) & 0xff);
+  ASSERT((result_exp >= 1) && (result_exp <= 252));
+
+  double scaled_d = bit_cast<double, uint64_t>(scaled);
+  ASSERT((scaled_d >= 0.5) && (scaled_d < 1.0));
+
+  // a in units of 1/512 rounded down.
+  int32_t q = static_cast<int32_t>(scaled_d * 512.0);
+  // reciprocal r.
+  double r = 1.0 / ((static_cast<double>(q) + 0.5) / 512.0);
+  // r in units of 1/256 rounded to nearest.
+  int32_t s = static_cast<int32_t>(256.0 * r + 0.5);
+  double estimate = static_cast<double>(s) / 256.0;
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+
+  // result = sign : result_exp<7:0> : estimate<51:29>
+  int32_t result_bits =
+      (a_bits & 0x80000000) | ((result_exp & 0xff) << 23) |
+      ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff);
+  return bit_cast<float, int32_t>(result_bits);
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vrecpes, assembler) {
+  __ LoadDImmediate(V1, 147.0, kNoPP);
+  __ fcvtsd(V1, V1);
+  __ vinss(V2, 0, V1, 0);
+  __ vinss(V2, 1, V1, 0);
+  __ vinss(V2, 2, V1, 0);
+  __ vinss(V2, 3, V1, 0);
+  __ vrecpes(V0, V2);
+  __ fcvtds(V0, V0);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vrecpes, test) {
+  EXPECT(test != NULL);
+  typedef double (*Vrecpes)();
+  float res = EXECUTE_TEST_CODE_DOUBLE(Vrecpes, test->entry());
+  EXPECT_FLOAT_EQ(arm_recip_estimate(147.0), res, 0.0001);
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vrecpss, assembler) {
+  __ LoadDImmediate(V1, 5.0, kNoPP);
+  __ LoadDImmediate(V2, 10.0, kNoPP);
+
+  __ fcvtsd(V1, V1);
+  __ fcvtsd(V2, V2);
+
+  __ vrecpss(V0, V1, V2);
+
+  __ fcvtds(V0, V0);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vrecpss, test) {
+  EXPECT(test != NULL);
+  typedef double (*Vrecpss)();
+  double res = EXECUTE_TEST_CODE_DOUBLE(Vrecpss, test->entry());
+  EXPECT_FLOAT_EQ(2.0 - 10.0 * 5.0, res, 0.0001);
+}
+
+
+ASSEMBLER_TEST_GENERATE(VRecps, assembler) {
+  __ LoadDImmediate(V0, 1.0 / 10.5, kNoPP);
+  __ fcvtsd(V0, V0);
+
+  __ vdups(V1, V0, 0);
+
+  __ VRecps(V2, V1);
+
+  __ vinss(V0, 0, V2, 0);
+  __ vinss(V1, 0, V2, 1);
+  __ vinss(V2, 0, V2, 2);
+  __ vinss(V3, 0, V2, 3);
+
+  __ fcvtds(V0, V0);
+  __ fcvtds(V1, V1);
+  __ fcvtds(V2, V2);
+  __ fcvtds(V3, V3);
+
+  __ faddd(V0, V0, V1);
+  __ faddd(V0, V0, V2);
+  __ faddd(V0, V0, V3);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(VRecps, test) {
+  typedef double (*VRecps)();
+  double res = EXECUTE_TEST_CODE_DOUBLE(VRecps, test->entry());
+  EXPECT_FLOAT_EQ(42.0, res, 0.0001);
+}
+
+
+static float arm_reciprocal_sqrt_estimate(float a) {
+  // From the ARM Architecture Reference Manual A2-87.
+  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
+  else if (a == 0.0) return INFINITY;
+  else if (isnan(a)) return a;
+
+  uint32_t a_bits = bit_cast<uint32_t, float>(a);
+  uint64_t scaled;
+  if (((a_bits >> 23) & 1) != 0) {
+    // scaled = '0 01111111101' : operand<22:0> : Zeros(29)
+    scaled = (static_cast<uint64_t>(0x3fd) << 52) |
+             ((static_cast<uint64_t>(a_bits) & 0x7fffff) << 29);
+  } else {
+    // scaled = '0 01111111110' : operand<22:0> : Zeros(29)
+    scaled = (static_cast<uint64_t>(0x3fe) << 52) |
+             ((static_cast<uint64_t>(a_bits) & 0x7fffff) << 29);
+  }
+  // result_exp = (380 - UInt(operand<30:23>) DIV 2;
+  int32_t result_exp = (380 - ((a_bits >> 23) & 0xff)) / 2;
+
+  double scaled_d = bit_cast<double, uint64_t>(scaled);
+  ASSERT((scaled_d >= 0.25) && (scaled_d < 1.0));
+
+  double r;
+  if (scaled_d < 0.5) {
+    // range 0.25 <= a < 0.5
+
+    // a in units of 1/512 rounded down.
+    int32_t q0 = static_cast<int32_t>(scaled_d * 512.0);
+    // reciprocal root r.
+    r = 1.0 / sqrt((static_cast<double>(q0) + 0.5) / 512.0);
+  } else {
+    // range 0.5 <= a < 1.0
+
+    // a in units of 1/256 rounded down.
+    int32_t q1 = static_cast<int32_t>(scaled_d * 256.0);
+    // reciprocal root r.
+    r = 1.0 / sqrt((static_cast<double>(q1) + 0.5) / 256.0);
+  }
+  // r in units of 1/256 rounded to nearest.
+  int32_t s = static_cast<int>(256.0 * r + 0.5);
+  double estimate = static_cast<double>(s) / 256.0;
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+
+  // result = 0 : result_exp<7:0> : estimate<51:29>
+  int32_t result_bits = ((result_exp & 0xff) << 23) |
+      ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff);
+  return bit_cast<float, int32_t>(result_bits);
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vrsqrtes, assembler) {
+  __ LoadDImmediate(V1, 147.0, kNoPP);
+  __ fcvtsd(V1, V1);
+
+  __ vrsqrtes(V0, V1);
+
+  __ fcvtds(V0, V0);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vrsqrtes, test) {
+  EXPECT(test != NULL);
+  typedef double (*Vrsqrtes)();
+  double res = EXECUTE_TEST_CODE_DOUBLE(Vrsqrtes, test->entry());
+  EXPECT_FLOAT_EQ(arm_reciprocal_sqrt_estimate(147.0), res, 0.0001);
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vrsqrtss, assembler) {
+    __ LoadDImmediate(V1, 5.0, kNoPP);
+    __ LoadDImmediate(V2, 10.0, kNoPP);
+
+    __ fcvtsd(V1, V1);
+    __ fcvtsd(V2, V2);
+
+    __ vrsqrtss(V0, V1, V2);
+
+    __ fcvtds(V0, V0);
+    __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vrsqrtss, test) {
+  EXPECT(test != NULL);
+  typedef double (*Vrsqrtss)();
+  double res = EXECUTE_TEST_CODE_DOUBLE(Vrsqrtss, test->entry());
+  EXPECT_FLOAT_EQ((3.0 - 10.0 * 5.0)/2.0, res, 0.0001);
+}
+
+
+ASSEMBLER_TEST_GENERATE(ReciprocalSqrt, assembler) {
+    __ LoadDImmediate(V1, 147000.0, kNoPP);
+    __ fcvtsd(V1, V1);
+
+    __ VRSqrts(V0, V1);
+
+    __ fcvtds(V0, V0);
+    __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(ReciprocalSqrt, test) {
+  EXPECT(test != NULL);
+  typedef double (*ReciprocalSqrt)();
+  double res = EXECUTE_TEST_CODE_DOUBLE(ReciprocalSqrt, test->entry());
+  EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001);
+}
+
+
 // Called from assembler_test.cc.
 // LR: return address.
 // R0: context.
diff --git a/runtime/vm/assembler_arm_test.cc b/runtime/vm/assembler_arm_test.cc
index 8029184..662bd11 100644
--- a/runtime/vm/assembler_arm_test.cc
+++ b/runtime/vm/assembler_arm_test.cc
@@ -17,7 +17,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(Simple, assembler) {
-  __ mov(R0, ShifterOperand(42));
+  __ mov(R0, Operand(42));
   __ bx(LR);
 }
 
@@ -29,7 +29,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(MoveNegated, assembler) {
-  __ mvn(R0, ShifterOperand(42));
+  __ mvn(R0, Operand(42));
   __ bx(LR);
 }
 
@@ -42,11 +42,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(MoveRotImm, assembler) {
-  ShifterOperand shifter_op;
-  EXPECT(ShifterOperand::CanHold(0x00550000, &shifter_op));
-  __ mov(R0, shifter_op);
-  EXPECT(ShifterOperand::CanHold(0x30000003, &shifter_op));
-  __ add(R0, R0, shifter_op);
+  Operand o;
+  EXPECT(Operand::CanHold(0x00550000, &o));
+  __ mov(R0, o);
+  EXPECT(Operand::CanHold(0x30000003, &o));
+  __ add(R0, R0, o);
   __ bx(LR);
 }
 
@@ -65,7 +65,7 @@
   __ LoadDecodableImmediate(R0, 0x12345678 << 1);
   HostCPUFeatures::set_arm_version(ARMv7);
   __ LoadDecodableImmediate(R1, 0x12345678);
-  __ sub(R0, R0, ShifterOperand(R1));
+  __ sub(R0, R0, Operand(R1));
   __ bx(LR);
 #else
   __ LoadDecodableImmediate(R0, 0x12345678);
@@ -82,8 +82,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadImmediate, assembler) {
-  __ mov(R0, ShifterOperand(0));
-  __ cmp(R0, ShifterOperand(0));
+  __ mov(R0, Operand(0));
+  __ cmp(R0, Operand(0));
   __ LoadImmediate(R0, 0x12345678, EQ);
   __ LoadImmediate(R0, 0x87654321, NE);
   __ bx(LR);
@@ -99,8 +99,8 @@
 
 ASSEMBLER_TEST_GENERATE(Vmov, assembler) {
   if (TargetCPUFeatures::vfp_supported()) {
-    __ mov(R3, ShifterOperand(43));
-    __ mov(R1, ShifterOperand(41));
+    __ mov(R3, Operand(43));
+    __ mov(R1, Operand(41));
     __ vmovsrr(S1, R1, R3);  // S1:S2 = 41:43
     __ vmovs(S0, S2);  // S0 = S2, S0:S1 == 43:41
     __ vmovd(D2, D0);  // D2 = D0, S4:S5 == 43:41
@@ -109,7 +109,7 @@
     __ vmovdrr(D3, R3, R2);  // D3 = R3:R2, S6:S7 == 41:41
     __ vmovsr(S7, R1);  // S7 = R1, S6:S7 == 41:43
     __ vmovrrd(R0, R1, D3);  // R0:R1 = D3, R0:R1 == 41:43
-    __ sub(R0, R1, ShifterOperand(R0));  // 43-41
+    __ sub(R0, R1, Operand(R0));  // 43-41
   } else {
     __ LoadImmediate(R0, 2);
   }
@@ -127,7 +127,7 @@
 ASSEMBLER_TEST_GENERATE(SingleVLoadStore, assembler) {
   if (TargetCPUFeatures::vfp_supported()) {
     __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
-    __ mov(R2, ShifterOperand(SP));
+    __ mov(R2, Operand(SP));
     __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex));
     __ vldrs(S0, Address(R2, (-kWordSize * 30)));
     __ vadds(S0, S0, S0);
@@ -156,10 +156,10 @@
 ASSEMBLER_TEST_GENERATE(SingleVShiftLoadStore, assembler) {
   if (TargetCPUFeatures::vfp_supported()) {
     __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
-    __ mov(R2, ShifterOperand(SP));
+    __ mov(R2, Operand(SP));
     // Expressing __str(R0, Address(SP, (-kWordSize * 32), Address::PreIndex));
     // as:
-    __ mov(R1, ShifterOperand(kWordSize));
+    __ mov(R1, Operand(kWordSize));
     __ str(R0, Address(SP, R1, LSL, 5, Address::NegPreIndex));
     __ vldrs(S0, Address(R2, (-kWordSize * 32)));
     __ vadds(S0, S0, S0);
@@ -192,7 +192,7 @@
     int64_t value = bit_cast<int64_t, double>(12.3);
     __ LoadImmediate(R0, Utils::Low32Bits(value));
     __ LoadImmediate(R1, Utils::High32Bits(value));
-    __ mov(R2, ShifterOperand(SP));
+    __ mov(R2, Operand(SP));
     __ str(R0, Address(SP, (-kWordSize * 30), Address::PreIndex));
     __ str(R1, Address(R2, (-kWordSize * 29)));
     __ vldrd(D0, Address(R2, (-kWordSize * 30)));
@@ -289,8 +289,8 @@
     __ vsqrtd(D0, D1);
     __ vcmpd(D0, D0);
     __ vmstat();
-    __ mov(R0, ShifterOperand(1), VS);
-    __ mov(R0, ShifterOperand(0), VC);
+    __ mov(R0, Operand(1), VS);
+    __ mov(R0, Operand(0), VC);
   } else {
     __ LoadImmediate(R0, 1);
   }
@@ -307,7 +307,7 @@
 
 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) {
   if (TargetCPUFeatures::vfp_supported()) {
-    __ mov(R3, ShifterOperand(6));
+    __ mov(R3, Operand(6));
     __ vmovsr(S3, R3);
     __ vcvtdi(D0, S3);
   } else {
@@ -367,7 +367,7 @@
 
 ASSEMBLER_TEST_GENERATE(IntToFloatConversion, assembler) {
   if (TargetCPUFeatures::vfp_supported()) {
-    __ mov(R3, ShifterOperand(6));
+    __ mov(R3, Operand(6));
     __ vmovsr(S3, R3);
     __ vcvtsi(S0, S3);
   } else {
@@ -503,13 +503,13 @@
     __ LoadSImmediate(S1, 12.5f);
 
     // Count errors in R0. R0 is zero if no errors found.
-    __ mov(R0, ShifterOperand(0));
+    __ mov(R0, Operand(0));
     __ vcmps(S0, S1);
     __ vmstat();
-    __ add(R0, R0, ShifterOperand(1), VS);  // Error if unordered (Nan).
-    __ add(R0, R0, ShifterOperand(2), GT);  // Error if greater.
-    __ add(R0, R0, ShifterOperand(4), EQ);  // Error if equal.
-    __ add(R0, R0, ShifterOperand(8), PL);  // Error if not less.
+    __ add(R0, R0, Operand(1), VS);  // Error if unordered (Nan).
+    __ add(R0, R0, Operand(2), GT);  // Error if greater.
+    __ add(R0, R0, Operand(4), EQ);  // Error if equal.
+    __ add(R0, R0, Operand(8), PL);  // Error if not less.
 
     // Test NaN.
     // Create NaN by dividing 0.0f/0.0f.
@@ -518,7 +518,7 @@
     __ vcmps(S1, S1);
     __ vmstat();
     // Error if not unordered (not Nan).
-    __ add(R0, R0, ShifterOperand(16), VC);
+    __ add(R0, R0, Operand(16), VC);
   } else {
     __ LoadImmediate(R0, 0);
   }
@@ -541,13 +541,13 @@
     __ LoadDImmediate(D1, 12.5, R1);
 
     // Count errors in R0. R0 is zero if no errors found.
-    __ mov(R0, ShifterOperand(0));
+    __ mov(R0, Operand(0));
     __ vcmpd(D0, D1);
     __ vmstat();
-    __ add(R0, R0, ShifterOperand(1), VS);  // Error if unordered (Nan).
-    __ add(R0, R0, ShifterOperand(2), GT);  // Error if greater.
-    __ add(R0, R0, ShifterOperand(4), EQ);  // Error if equal.
-    __ add(R0, R0, ShifterOperand(8), PL);  // Error if not less.
+    __ add(R0, R0, Operand(1), VS);  // Error if unordered (Nan).
+    __ add(R0, R0, Operand(2), GT);  // Error if greater.
+    __ add(R0, R0, Operand(4), EQ);  // Error if equal.
+    __ add(R0, R0, Operand(8), PL);  // Error if not less.
 
     // Test NaN.
     // Create NaN by dividing 0.0/0.0.
@@ -556,7 +556,7 @@
     __ vcmpd(D1, D1);
     __ vmstat();
     // Error if not unordered (not Nan).
-    __ add(R0, R0, ShifterOperand(16), VC);
+    __ add(R0, R0, Operand(16), VC);
   } else {
     __ LoadImmediate(R0, 0);
   }
@@ -574,11 +574,11 @@
 
 ASSEMBLER_TEST_GENERATE(Loop, assembler) {
   Label loop_entry;
-  __ mov(R0, ShifterOperand(1));
-  __ mov(R1, ShifterOperand(2));
+  __ mov(R0, Operand(1));
+  __ mov(R1, Operand(2));
   __ Bind(&loop_entry);
-  __ mov(R0, ShifterOperand(R0, LSL, 1));
-  __ movs(R1, ShifterOperand(R1, LSR, 1));
+  __ mov(R0, Operand(R0, LSL, 1));
+  __ movs(R1, Operand(R1, LSR, 1));
   __ b(&loop_entry, NE);
   __ bx(LR);
 }
@@ -593,9 +593,9 @@
 
 ASSEMBLER_TEST_GENERATE(ForwardBranch, assembler) {
   Label skip;
-  __ mov(R0, ShifterOperand(42));
+  __ mov(R0, Operand(42));
   __ b(&skip);
-  __ mov(R0, ShifterOperand(11));
+  __ mov(R0, Operand(11));
   __ Bind(&skip);
   __ bx(LR);
 }
@@ -611,11 +611,11 @@
 ASSEMBLER_TEST_GENERATE(Loop2, assembler) {
   Label loop_entry;
   __ set_use_far_branches(true);
-  __ mov(R0, ShifterOperand(1));
-  __ mov(R1, ShifterOperand(2));
+  __ mov(R0, Operand(1));
+  __ mov(R1, Operand(2));
   __ Bind(&loop_entry);
-  __ mov(R0, ShifterOperand(R0, LSL, 1));
-  __ movs(R1, ShifterOperand(R1, LSR, 1));
+  __ mov(R0, Operand(R0, LSL, 1));
+  __ movs(R1, Operand(R1, LSR, 1));
   __ b(&loop_entry, NE);
   __ bx(LR);
 }
@@ -631,14 +631,14 @@
 ASSEMBLER_TEST_GENERATE(Loop3, assembler) {
   Label loop_entry;
   __ set_use_far_branches(true);
-  __ mov(R0, ShifterOperand(1));
-  __ mov(R1, ShifterOperand(2));
+  __ mov(R0, Operand(1));
+  __ mov(R1, Operand(2));
   __ Bind(&loop_entry);
   for (int i = 0; i < (1 << 22); i++) {
     __ nop();
   }
-  __ mov(R0, ShifterOperand(R0, LSL, 1));
-  __ movs(R1, ShifterOperand(R1, LSR, 1));
+  __ mov(R0, Operand(R0, LSL, 1));
+  __ movs(R1, Operand(R1, LSR, 1));
   __ b(&loop_entry, NE);
   __ bx(LR);
 }
@@ -652,7 +652,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(LoadStore, assembler) {
-  __ mov(R1, ShifterOperand(123));
+  __ mov(R1, Operand(123));
   __ Push(R1);
   __ Pop(R0);
   __ bx(LR);
@@ -667,11 +667,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(AddSub, assembler) {
-  __ mov(R1, ShifterOperand(40));
-  __ sub(R1, R1, ShifterOperand(2));
-  __ add(R0, R1, ShifterOperand(4));
-  __ rsbs(R0, R0, ShifterOperand(100));
-  __ rsc(R0, R0, ShifterOperand(100));
+  __ mov(R1, Operand(40));
+  __ sub(R1, R1, Operand(2));
+  __ add(R0, R1, Operand(4));
+  __ rsbs(R0, R0, Operand(100));
+  __ rsc(R0, R0, Operand(100));
   __ bx(LR);
 }
 
@@ -685,10 +685,10 @@
 
 ASSEMBLER_TEST_GENERATE(AddCarry, assembler) {
   __ LoadImmediate(R2, 0xFFFFFFFF);
-  __ mov(R1, ShifterOperand(1));
-  __ mov(R0, ShifterOperand(0));
-  __ adds(R2, R2, ShifterOperand(R1));
-  __ adcs(R0, R0, ShifterOperand(R0));
+  __ mov(R1, Operand(1));
+  __ mov(R0, Operand(0));
+  __ adds(R2, R2, Operand(R1));
+  __ adcs(R0, R0, Operand(R0));
   __ bx(LR);
 }
 
@@ -702,10 +702,10 @@
 
 ASSEMBLER_TEST_GENERATE(SubCarry, assembler) {
   __ LoadImmediate(R2, 0x0);
-  __ mov(R1, ShifterOperand(1));
-  __ mov(R0, ShifterOperand(0));
-  __ subs(R2, R2, ShifterOperand(R1));
-  __ sbcs(R0, R0, ShifterOperand(R0));
+  __ mov(R1, Operand(1));
+  __ mov(R0, Operand(0));
+  __ subs(R2, R2, Operand(R1));
+  __ sbcs(R0, R0, Operand(R0));
   __ bx(LR);
 }
 
@@ -718,11 +718,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(AndOrr, assembler) {
-  __ mov(R1, ShifterOperand(40));
-  __ mov(R2, ShifterOperand(0));
-  __ and_(R1, R2, ShifterOperand(R1));
-  __ mov(R3, ShifterOperand(42));
-  __ orr(R0, R1, ShifterOperand(R3));
+  __ mov(R1, Operand(40));
+  __ mov(R2, Operand(0));
+  __ and_(R1, R2, Operand(R1));
+  __ mov(R3, Operand(42));
+  __ orr(R0, R1, Operand(R3));
   __ bx(LR);
 }
 
@@ -735,13 +735,13 @@
 
 
 ASSEMBLER_TEST_GENERATE(Orrs, assembler) {
-  __ mov(R0, ShifterOperand(0));
-  __ tst(R0, ShifterOperand(R1));  // Set zero-flag.
-  __ orrs(R0, R0, ShifterOperand(1));  // Clear zero-flag.
+  __ mov(R0, Operand(0));
+  __ tst(R0, Operand(R1));  // Set zero-flag.
+  __ orrs(R0, R0, Operand(1));  // Clear zero-flag.
   __ bx(LR, EQ);
-  __ mov(R0, ShifterOperand(42));
+  __ mov(R0, Operand(42));
   __ bx(LR, NE);  // Only this return should fire.
-  __ mov(R0, ShifterOperand(2));
+  __ mov(R0, Operand(2));
   __ bx(LR);
 }
 
@@ -754,10 +754,10 @@
 
 
 ASSEMBLER_TEST_GENERATE(Multiply, assembler) {
-  __ mov(R1, ShifterOperand(20));
-  __ mov(R2, ShifterOperand(40));
+  __ mov(R1, Operand(20));
+  __ mov(R2, Operand(40));
   __ mul(R3, R2, R1);
-  __ mov(R0, ShifterOperand(R3));
+  __ mov(R0, Operand(R3));
   __ bx(LR);
 }
 
@@ -807,11 +807,11 @@
 #endif
   if (TargetCPUFeatures::arm_version() == ARMv7) {
     __ Push(R4);
-    __ mov(IP, ShifterOperand(R0));
+    __ mov(IP, Operand(R0));
     __ mul(R4, R2, R1);
     __ umull(R0, R1, R2, IP);
     __ mla(R2, IP, R3, R4);
-    __ add(R1, R2, ShifterOperand(R1));
+    __ add(R1, R2, Operand(R1));
     __ Pop(R4);
   } else {
     __ LoadImmediate(R0, 6);
@@ -884,26 +884,26 @@
 ASSEMBLER_TEST_GENERATE(Clz, assembler) {
   Label error;
 
-  __ mov(R0, ShifterOperand(0));
+  __ mov(R0, Operand(0));
   __ clz(R1, R0);
-  __ cmp(R1, ShifterOperand(32));
+  __ cmp(R1, Operand(32));
   __ b(&error, NE);
-  __ mov(R2, ShifterOperand(42));
+  __ mov(R2, Operand(42));
   __ clz(R2, R2);
-  __ cmp(R2, ShifterOperand(26));
+  __ cmp(R2, Operand(26));
   __ b(&error, NE);
-  __ mvn(R0, ShifterOperand(0));
+  __ mvn(R0, Operand(0));
   __ clz(R1, R0);
-  __ cmp(R1, ShifterOperand(0));
+  __ cmp(R1, Operand(0));
   __ b(&error, NE);
   __ Lsr(R0, R0, 3);
   __ clz(R1, R0);
-  __ cmp(R1, ShifterOperand(3));
+  __ cmp(R1, Operand(3));
   __ b(&error, NE);
-  __ mov(R0, ShifterOperand(0));
+  __ mov(R0, Operand(0));
   __ bx(LR);
   __ Bind(&error);
-  __ mov(R0, ShifterOperand(1));
+  __ mov(R0, Operand(1));
   __ bx(LR);
 }
 
@@ -918,11 +918,11 @@
 ASSEMBLER_TEST_GENERATE(Tst, assembler) {
   Label skip;
 
-  __ mov(R0, ShifterOperand(42));
-  __ mov(R1, ShifterOperand(40));
-  __ tst(R1, ShifterOperand(0));
+  __ mov(R0, Operand(42));
+  __ mov(R1, Operand(40));
+  __ tst(R1, Operand(0));
   __ b(&skip, NE);
-  __ mov(R0, ShifterOperand(0));
+  __ mov(R0, Operand(0));
   __ Bind(&skip);
   __ bx(LR);
 }
@@ -938,10 +938,10 @@
 ASSEMBLER_TEST_GENERATE(Lsl, assembler) {
   Label skip;
 
-  __ mov(R0, ShifterOperand(1));
-  __ mov(R0, ShifterOperand(R0, LSL, 1));
-  __ mov(R1, ShifterOperand(1));
-  __ mov(R0, ShifterOperand(R0, LSL, R1));
+  __ mov(R0, Operand(1));
+  __ mov(R0, Operand(R0, LSL, 1));
+  __ mov(R1, Operand(1));
+  __ mov(R0, Operand(R0, LSL, R1));
   __ bx(LR);
 }
 
@@ -956,10 +956,10 @@
 ASSEMBLER_TEST_GENERATE(Lsr, assembler) {
   Label skip;
 
-  __ mov(R0, ShifterOperand(4));
-  __ mov(R0, ShifterOperand(R0, LSR, 1));
-  __ mov(R1, ShifterOperand(1));
-  __ mov(R0, ShifterOperand(R0, LSR, R1));
+  __ mov(R0, Operand(4));
+  __ mov(R0, Operand(R0, LSR, 1));
+  __ mov(R1, Operand(1));
+  __ mov(R0, Operand(R0, LSR, R1));
   __ bx(LR);
 }
 
@@ -974,7 +974,7 @@
 ASSEMBLER_TEST_GENERATE(Lsr1, assembler) {
   Label skip;
 
-  __ mov(R0, ShifterOperand(1));
+  __ mov(R0, Operand(1));
   __ Lsl(R0, R0, 31);
   __ Lsr(R0, R0, 31);
   __ bx(LR);
@@ -991,7 +991,7 @@
 ASSEMBLER_TEST_GENERATE(Asr1, assembler) {
   Label skip;
 
-  __ mov(R0, ShifterOperand(1));
+  __ mov(R0, Operand(1));
   __ Lsl(R0, R0, 31);
   __ Asr(R0, R0, 31);
   __ bx(LR);
@@ -1006,8 +1006,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(Rsb, assembler) {
-  __ mov(R3, ShifterOperand(10));
-  __ rsb(R0, R3, ShifterOperand(42));
+  __ mov(R3, Operand(10));
+  __ rsb(R0, R3, Operand(42));
   __ bx(LR);
 }
 
@@ -1022,36 +1022,36 @@
 ASSEMBLER_TEST_GENERATE(Ldrh, assembler) {
   Label Test1, Test2, Test3, Done;
 
-  __ mov(R1, ShifterOperand(0x11));
-  __ mov(R2, ShifterOperand(SP));
+  __ mov(R1, Operand(0x11));
+  __ mov(R2, Operand(SP));
   __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex));
   __ ldrh(R0, Address(R2, (-kWordSize * 30)));
-  __ cmp(R0, ShifterOperand(0x11));
+  __ cmp(R0, Operand(0x11));
   __ b(&Test1, EQ);
-  __ mov(R0, ShifterOperand(1));
+  __ mov(R0, Operand(1));
   __ b(&Done);
   __ Bind(&Test1);
 
-  __ mov(R0, ShifterOperand(0x22));
+  __ mov(R0, Operand(0x22));
   __ strh(R0, Address(R2, (-kWordSize * 30)));
   __ ldrh(R1, Address(R2, (-kWordSize * 30)));
-  __ cmp(R1, ShifterOperand(0x22));
+  __ cmp(R1, Operand(0x22));
   __ b(&Test2, EQ);
-  __ mov(R0, ShifterOperand(1));
+  __ mov(R0, Operand(1));
   __ b(&Done);
   __ Bind(&Test2);
 
-  __ mov(R0, ShifterOperand(0));
+  __ mov(R0, Operand(0));
   __ AddImmediate(R2, (-kWordSize * 30));
   __ strh(R0, Address(R2));
   __ ldrh(R1, Address(R2));
-  __ cmp(R1, ShifterOperand(0));
+  __ cmp(R1, Operand(0));
   __ b(&Test3, EQ);
-  __ mov(R0, ShifterOperand(1));
+  __ mov(R0, Operand(1));
   __ b(&Done);
   __ Bind(&Test3);
 
-  __ mov(R0, ShifterOperand(0));
+  __ mov(R0, Operand(0));
   __ Bind(&Done);
   __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex));
   __ bx(LR);
@@ -1066,8 +1066,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(Ldrsb, assembler) {
-  __ mov(R1, ShifterOperand(0xFF));
-  __ mov(R2, ShifterOperand(SP));
+  __ mov(R1, Operand(0xFF));
+  __ mov(R2, Operand(SP));
   __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex));
   __ ldrsb(R0, Address(R2, (-kWordSize * 30)));
   __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex));
@@ -1083,8 +1083,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(Ldrb, assembler) {
-  __ mov(R1, ShifterOperand(0xFF));
-  __ mov(R2, ShifterOperand(SP));
+  __ mov(R1, Operand(0xFF));
+  __ mov(R2, Operand(SP));
   __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex));
   __ ldrb(R0, Address(R2, (-kWordSize * 30)));
   __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex));
@@ -1100,8 +1100,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(Ldrsh, assembler) {
-  __ mov(R1, ShifterOperand(0xFF));
-  __ mov(R2, ShifterOperand(SP));
+  __ mov(R1, Operand(0xFF));
+  __ mov(R2, Operand(SP));
   __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex));
   __ ldrsh(R0, Address(R2, (-kWordSize * 30)));
   __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex));
@@ -1117,8 +1117,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(Ldrh1, assembler) {
-  __ mov(R1, ShifterOperand(0xFF));
-  __ mov(R2, ShifterOperand(SP));
+  __ mov(R1, Operand(0xFF));
+  __ mov(R2, Operand(SP));
   __ str(R1, Address(SP, (-kWordSize * 30), Address::PreIndex));
   __ ldrh(R0, Address(R2, (-kWordSize * 30)));
   __ ldr(R1, Address(SP, (kWordSize * 30), Address::PostIndex));
@@ -1134,13 +1134,13 @@
 
 
 ASSEMBLER_TEST_GENERATE(Ldrd, assembler) {
-  __ mov(IP, ShifterOperand(SP));
+  __ mov(IP, Operand(SP));
   __ strd(R2, Address(SP, (-kWordSize * 30), Address::PreIndex));
   __ strd(R0, Address(IP, (-kWordSize * 28)));
   __ ldrd(R2, Address(IP, (-kWordSize * 28)));
   __ ldrd(R0, Address(SP, (kWordSize * 30), Address::PostIndex));
-  __ sub(R0, R0, ShifterOperand(R2));
-  __ add(R1, R1, ShifterOperand(R3));
+  __ sub(R0, R0, Operand(R2));
+  __ add(R1, R1, Operand(R3));
   __ bx(LR);
 }
 
@@ -1154,10 +1154,10 @@
 
 
 ASSEMBLER_TEST_GENERATE(Ldm_stm_da, assembler) {
-  __ mov(R0, ShifterOperand(1));
-  __ mov(R1, ShifterOperand(7));
-  __ mov(R2, ShifterOperand(11));
-  __ mov(R3, ShifterOperand(31));
+  __ mov(R0, Operand(1));
+  __ mov(R1, Operand(7));
+  __ mov(R2, Operand(11));
+  __ mov(R3, Operand(31));
   __ Push(R5);  // We use R5 as accumulator.
   __ Push(R5);
   __ Push(R5);
@@ -1168,17 +1168,17 @@
   __ str(R2, Address(SP));                 // Should be a free slot.
   __ ldr(R5, Address(SP, 1 * kWordSize));  // R0.  R5 = +1.
   __ ldr(IP, Address(SP, 2 * kWordSize));  // R1.
-  __ sub(R5, R5, ShifterOperand(IP));      // -R1. R5 = -6.
+  __ sub(R5, R5, Operand(IP));      // -R1. R5 = -6.
   __ ldr(IP, Address(SP, 3 * kWordSize));  // R2.
-  __ add(R5, R5, ShifterOperand(IP));      // +R2. R5 = +5.
+  __ add(R5, R5, Operand(IP));      // +R2. R5 = +5.
   __ ldr(IP, Address(SP, 4 * kWordSize));  // R3.
-  __ sub(R5, R5, ShifterOperand(IP));      // -R3. R5 = -26.
+  __ sub(R5, R5, Operand(IP));      // -R3. R5 = -26.
   __ ldm(IB_W, SP, (1 << R0 | 1 << R1 | 1 << R2 | 1 << R3));
   // Same operations again. But this time from the restore registers.
-  __ add(R5, R5, ShifterOperand(R0));
-  __ sub(R5, R5, ShifterOperand(R1));
-  __ add(R5, R5, ShifterOperand(R2));
-  __ sub(R0, R5, ShifterOperand(R3));  // R0 = result = -52.
+  __ add(R5, R5, Operand(R0));
+  __ sub(R5, R5, Operand(R1));
+  __ add(R5, R5, Operand(R2));
+  __ sub(R0, R5, Operand(R3));  // R0 = result = -52.
   __ Pop(R1);  // Remove storage slot.
   __ Pop(R5);  // Restore R5.
   __ Pop(R5);  // Restore R5.
@@ -1197,8 +1197,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(AddressShiftStrLSL1NegOffset, assembler) {
-  __ mov(R2, ShifterOperand(42));
-  __ mov(R1, ShifterOperand(kWordSize));
+  __ mov(R2, Operand(42));
+  __ mov(R1, Operand(kWordSize));
   __ str(R2, Address(SP, R1, LSL, 1, Address::NegOffset));
   __ ldr(R0, Address(SP, (-kWordSize * 2), Address::Offset));
   __ bx(LR);
@@ -1213,8 +1213,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLSL5NegOffset, assembler) {
-  __ mov(R2, ShifterOperand(42));
-  __ mov(R1, ShifterOperand(kWordSize));
+  __ mov(R2, Operand(42));
+  __ mov(R1, Operand(kWordSize));
   __ str(R2, Address(SP, (-kWordSize * 32), Address::Offset));
   __ ldr(R0, Address(SP, R1, LSL, 5, Address::NegOffset));
   __ bx(LR);
@@ -1229,8 +1229,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(AddressShiftStrLRS1NegOffset, assembler) {
-  __ mov(R2, ShifterOperand(42));
-  __ mov(R1, ShifterOperand(kWordSize * 2));
+  __ mov(R2, Operand(42));
+  __ mov(R1, Operand(kWordSize * 2));
   __ str(R2, Address(SP, R1, LSR, 1, Address::NegOffset));
   __ ldr(R0, Address(SP, -kWordSize, Address::Offset));
   __ bx(LR);
@@ -1245,8 +1245,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLRS1NegOffset, assembler) {
-  __ mov(R2, ShifterOperand(42));
-  __ mov(R1, ShifterOperand(kWordSize * 2));
+  __ mov(R2, Operand(42));
+  __ mov(R1, Operand(kWordSize * 2));
   __ str(R2, Address(SP, -kWordSize, Address::Offset));
   __ ldr(R0, Address(SP, R1, LSR, 1, Address::NegOffset));
   __ bx(LR);
@@ -1261,12 +1261,12 @@
 
 
 ASSEMBLER_TEST_GENERATE(AddressShiftStrLSLNegPreIndex, assembler) {
-  __ mov(R2, ShifterOperand(42));
-  __ mov(R1, ShifterOperand(kWordSize));
-  __ mov(R3, ShifterOperand(SP));
+  __ mov(R2, Operand(42));
+  __ mov(R1, Operand(kWordSize));
+  __ mov(R3, Operand(SP));
   __ str(R2, Address(SP, R1, LSL, 5, Address::NegPreIndex));
   __ ldr(R0, Address(R3, (-kWordSize * 32), Address::Offset));
-  __ mov(SP, ShifterOperand(R3));
+  __ mov(SP, Operand(R3));
   __ bx(LR);
 }
 
@@ -1279,8 +1279,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(AddressShiftLdrLSLNegPreIndex, assembler) {
-  __ mov(R2, ShifterOperand(42));
-  __ mov(R1, ShifterOperand(kWordSize));
+  __ mov(R2, Operand(42));
+  __ mov(R1, Operand(kWordSize));
   __ str(R2, Address(SP, (-kWordSize * 32), Address::PreIndex));
   __ ldr(R0, Address(SP, R1, LSL, 5, Address::PostIndex));
   __ bx(LR);
@@ -1311,32 +1311,32 @@
     __ vldmd(IA_W, SP, D0, 5);  // Pop stack into D0 - D4, inc SP
 
     // Load success value into R0
-    __ mov(R0, ShifterOperand(42));
+    __ mov(R0, Operand(42));
 
     // Check that 4.0 is back in D4
     __ LoadDImmediate(D5, 4.0, R1);
     __ vcmpd(D4, D5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
     // Check that 3.0 is back in D3
     __ LoadDImmediate(D5, 3.0, R1);
     __ vcmpd(D3, D5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
 
     // Check that 2.0 is back in D2
     __ LoadDImmediate(D5, 2.0, R1);
     __ vcmpd(D2, D5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
     // Check that 1.0 is back in D1
     __ LoadDImmediate(D5, 1.0, R1);
     __ vcmpd(D1, D5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
   } else {
     __ LoadImmediate(R0, 42);
   }
@@ -1368,31 +1368,31 @@
     __ vldms(IA_W, SP, S0, S4);  // Pop stack into S0 - S4, inc SP
 
     // Load success value into R0
-    __ mov(R0, ShifterOperand(42));
+    __ mov(R0, Operand(42));
 
     // Check that 4.0 is back in S4
     __ LoadSImmediate(S5, 4.0);
     __ vcmps(S4, S5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
     // Check that 3.0 is back in S3
     __ LoadSImmediate(S5, 3.0);
     __ vcmps(S3, S5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
     // Check that 2.0 is back in S2
     __ LoadSImmediate(S5, 2.0);
     __ vcmps(S2, S5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
     // Check that 1.0 is back in S1
     __ LoadSImmediate(S5, 1.0);
     __ vcmps(S1, S5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
   } else {
     __ LoadImmediate(R0, 42);
   }
@@ -1422,32 +1422,32 @@
     __ vldmd(IA_W, SP, D1, 4);  // Pop stack into D1 - D4, inc SP
 
     // Load success value into R0
-    __ mov(R0, ShifterOperand(42));
+    __ mov(R0, Operand(42));
 
     // Check that 4.0 is back in D4
     __ LoadDImmediate(D5, 4.0, R1);
     __ vcmpd(D4, D5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
     // Check that 3.0 is back in D3
     __ LoadDImmediate(D5, 3.0, R1);
     __ vcmpd(D3, D5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
 
     // Check that 2.0 is back in D2
     __ LoadDImmediate(D5, 2.0, R1);
     __ vcmpd(D2, D5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
     // Check that 1.0 is back in D1
     __ LoadDImmediate(D5, 1.0, R1);
     __ vcmpd(D1, D5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
   } else {
     __ LoadImmediate(R0, 42);
   }
@@ -1477,31 +1477,31 @@
     __ vldms(IA_W, SP, S1, S4);  // Pop stack into S0 - S4, inc SP
 
     // Load success value into R0
-    __ mov(R0, ShifterOperand(42));
+    __ mov(R0, Operand(42));
 
     // Check that 4.0 is back in S4
     __ LoadSImmediate(S5, 4.0);
     __ vcmps(S4, S5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
     // Check that 3.0 is back in S3
     __ LoadSImmediate(S5, 3.0);
     __ vcmps(S3, S5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
     // Check that 2.0 is back in S2
     __ LoadSImmediate(S5, 2.0);
     __ vcmps(S2, S5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
     // Check that 1.0 is back in S1
     __ LoadSImmediate(S5, 1.0);
     __ vcmps(S1, S5);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
   } else {
     __ LoadImmediate(R0, 42);
   }
@@ -1532,38 +1532,38 @@
     __ vldmd(IA_W, SP, D5, 5);  // Pop stack into D5 - D9, inc SP
 
     // Load success value into R0
-    __ mov(R0, ShifterOperand(42));
+    __ mov(R0, Operand(42));
 
     // Check that 4.0 is in D9
     __ LoadDImmediate(D10, 4.0, R1);
     __ vcmpd(D9, D10);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
     // Check that 3.0 is in D8
     __ LoadDImmediate(D10, 3.0, R1);
     __ vcmpd(D8, D10);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
 
     // Check that 2.0 is in D7
     __ LoadDImmediate(D10, 2.0, R1);
     __ vcmpd(D7, D10);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
     // Check that 1.0 is in D6
     __ LoadDImmediate(D10, 1.0, R1);
     __ vcmpd(D6, D10);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
     // Check that 0.0 is in D5
     __ LoadDImmediate(D10, 0.0, R1);
     __ vcmpd(D5, D10);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
     // Restore used callee-saved FPU registers.
     __ vldmd(IA_W, SP, D8, 3);
@@ -1594,37 +1594,37 @@
     __ vldms(IA_W, SP, S5, S9);  // Pop stack into S5 - S9, inc SP
 
     // Load success value into R0
-    __ mov(R0, ShifterOperand(42));
+    __ mov(R0, Operand(42));
 
     // Check that 4.0 is in S9
     __ LoadSImmediate(S10, 4.0);
     __ vcmps(S9, S10);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
     // Check that 3.0 is in S8
     __ LoadSImmediate(S10, 3.0);
     __ vcmps(S8, S10);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
     // Check that 2.0 is in S7
     __ LoadSImmediate(S10, 2.0);
     __ vcmps(S7, S10);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
     // Check that 1.0 is back in S6
     __ LoadSImmediate(S10, 1.0);
     __ vcmps(S6, S10);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
     // Check that 0.0 is back in S5
     __ LoadSImmediate(S10, 0.0);
     __ vcmps(S5, S10);
     __ vmstat();
-    __ mov(R0, ShifterOperand(0), NE);  // Put failure value into R0 if NE
+    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
   } else {
     __ LoadImmediate(R0, 42);
   }
@@ -1641,12 +1641,12 @@
 
 ASSEMBLER_TEST_GENERATE(Udiv, assembler) {
   if (TargetCPUFeatures::integer_division_supported()) {
-    __ mov(R0, ShifterOperand(27));
-    __ mov(R1, ShifterOperand(9));
+    __ mov(R0, Operand(27));
+    __ mov(R1, Operand(9));
     __ udiv(R2, R0, R1);
-    __ mov(R0, ShifterOperand(R2));
+    __ mov(R0, Operand(R2));
   } else {
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
   }
   __ bx(LR);
 }
@@ -1661,10 +1661,10 @@
 
 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) {
   if (TargetCPUFeatures::integer_division_supported()) {
-    __ mov(R0, ShifterOperand(27));
+    __ mov(R0, Operand(27));
     __ LoadImmediate(R1, -9);
     __ sdiv(R2, R0, R1);
-    __ mov(R0, ShifterOperand(R2));
+    __ mov(R0, Operand(R2));
   } else {
     __ LoadImmediate(R0, -3);
   }
@@ -1681,10 +1681,10 @@
 
 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) {
   if (TargetCPUFeatures::integer_division_supported()) {
-    __ mov(R0, ShifterOperand(27));
-    __ mov(R1, ShifterOperand(0));
+    __ mov(R0, Operand(27));
+    __ mov(R1, Operand(0));
     __ udiv(R2, R0, R1);
-    __ mov(R0, ShifterOperand(R2));
+    __ mov(R0, Operand(R2));
   } else {
     __ LoadImmediate(R0, 0);
   }
@@ -1701,10 +1701,10 @@
 
 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) {
   if (TargetCPUFeatures::integer_division_supported()) {
-    __ mov(R0, ShifterOperand(27));
-    __ mov(R1, ShifterOperand(0));
+    __ mov(R0, Operand(27));
+    __ mov(R1, Operand(0));
     __ sdiv(R2, R0, R1);
-    __ mov(R0, ShifterOperand(R2));
+    __ mov(R0, Operand(R2));
   } else {
     __ LoadImmediate(R0, 0);
   }
@@ -1724,7 +1724,7 @@
     __ LoadImmediate(R0, 0x80000000);
     __ LoadImmediate(R1, 0xffffffff);
     __ udiv(R2, R0, R1);
-    __ mov(R0, ShifterOperand(R2));
+    __ mov(R0, Operand(R2));
   } else {
     __ LoadImmediate(R0, 0);
   }
@@ -1744,7 +1744,7 @@
     __ LoadImmediate(R0, 0x80000000);
     __ LoadImmediate(R1, 0xffffffff);
     __ sdiv(R2, R0, R1);
-    __ mov(R0, ShifterOperand(R2));
+    __ mov(R0, Operand(R2));
   } else {
     __ LoadImmediate(R0, 0x80000000);
   }
@@ -1764,14 +1764,14 @@
 #if defined(USING_SIMULATOR)
   bool orig = TargetCPUFeatures::integer_division_supported();
   HostCPUFeatures::set_integer_division_supported(true);
-  __ mov(R0, ShifterOperand(27));
-  __ mov(R1, ShifterOperand(9));
+  __ mov(R0, Operand(27));
+  __ mov(R1, Operand(9));
   __ IntegerDivide(R0, R0, R1, D0, D1);
   HostCPUFeatures::set_integer_division_supported(orig);
   __ bx(LR);
 #else
-  __ mov(R0, ShifterOperand(27));
-  __ mov(R1, ShifterOperand(9));
+  __ mov(R0, Operand(27));
+  __ mov(R1, Operand(9));
   __ IntegerDivide(R0, R0, R1, D0, D1);
   __ bx(LR);
 #endif
@@ -1789,14 +1789,14 @@
 #if defined(USING_SIMULATOR)
   bool orig = TargetCPUFeatures::integer_division_supported();
   HostCPUFeatures::set_integer_division_supported(false);
-  __ mov(R0, ShifterOperand(27));
-  __ mov(R1, ShifterOperand(9));
+  __ mov(R0, Operand(27));
+  __ mov(R1, Operand(9));
   __ IntegerDivide(R0, R0, R1, D0, D1);
   HostCPUFeatures::set_integer_division_supported(orig);
   __ bx(LR);
 #else
-  __ mov(R0, ShifterOperand(27));
-  __ mov(R1, ShifterOperand(9));
+  __ mov(R0, Operand(27));
+  __ mov(R1, Operand(9));
   __ IntegerDivide(R0, R0, R1, D0, D1);
   __ bx(LR);
 #endif
@@ -1811,10 +1811,10 @@
 
 
 ASSEMBLER_TEST_GENERATE(Muls, assembler) {
-  __ mov(R0, ShifterOperand(3));
+  __ mov(R0, Operand(3));
   __ LoadImmediate(R1, -9);
   __ muls(R2, R0, R1);
-  __ mov(R0, ShifterOperand(42), MI);
+  __ mov(R0, Operand(42), MI);
   __ bx(LR);
 }
 
@@ -1828,21 +1828,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vaddqi8, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(5));
+    __ mov(R0, Operand(5));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(6));
+    __ mov(R0, Operand(6));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(7));
+    __ mov(R0, Operand(7));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(8));
+    __ mov(R0, Operand(8));
     __ vmovsr(S7, R0);
 
     __ vaddqi(kByte, Q2, Q0, Q1);
@@ -1852,9 +1852,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 36);
@@ -1872,21 +1872,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vaddqi16, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(5));
+    __ mov(R0, Operand(5));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(6));
+    __ mov(R0, Operand(6));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(7));
+    __ mov(R0, Operand(7));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(8));
+    __ mov(R0, Operand(8));
     __ vmovsr(S7, R0);
 
     __ vaddqi(kHalfword, Q2, Q0, Q1);
@@ -1896,9 +1896,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 36);
@@ -1916,21 +1916,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vaddqi32, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(5));
+    __ mov(R0, Operand(5));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(6));
+    __ mov(R0, Operand(6));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(7));
+    __ mov(R0, Operand(7));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(8));
+    __ mov(R0, Operand(8));
     __ vmovsr(S7, R0);
 
     __ vaddqi(kWord, Q2, Q0, Q1);
@@ -1940,9 +1940,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 36);
@@ -1960,13 +1960,13 @@
 
 ASSEMBLER_TEST_GENERATE(Vaddqi64, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S6, R0);
 
     __ vaddqi(kWordPair, Q2, Q0, Q1);
@@ -1974,7 +1974,7 @@
     __ vmovrs(R0, S8);
     __ vmovrs(R2, S10);
 
-    __ add(R0, R0, ShifterOperand(R2));
+    __ add(R0, R0, Operand(R2));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 10);
@@ -2091,7 +2091,7 @@
     __ vshlqu(kWordPair, out, value, temp);
 
     // check for overflow by shifting back and comparing.
-    __ rsb(shift, shift, ShifterOperand(0));
+    __ rsb(shift, shift, Operand(0));
     __ vmovsr(stemp0, shift);
     __ vshlqi(kWordPair, temp, out, temp);
     __ vceqqi(kWord, out, temp, value);
@@ -2148,7 +2148,7 @@
     __ vshlqu(kWordPair, out, value, temp);
 
     // check for overflow by shifting back and comparing.
-    __ rsb(shift, shift, ShifterOperand(0));
+    __ rsb(shift, shift, Operand(0));
     __ vmovsr(stemp0, shift);
     __ vshlqi(kWordPair, temp, out, temp);
     __ vceqqi(kWord, out, temp, value);
@@ -2182,21 +2182,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vsubqi8, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(6));
+    __ mov(R0, Operand(6));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(8));
+    __ mov(R0, Operand(8));
     __ vmovsr(S7, R0);
 
     __ vsubqi(kByte, Q2, Q1, Q0);
@@ -2206,9 +2206,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 10);
@@ -2226,21 +2226,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vsubqi16, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(6));
+    __ mov(R0, Operand(6));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(8));
+    __ mov(R0, Operand(8));
     __ vmovsr(S7, R0);
 
     __ vsubqi(kHalfword, Q2, Q1, Q0);
@@ -2250,9 +2250,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 10);
@@ -2270,21 +2270,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vsubqi32, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(6));
+    __ mov(R0, Operand(6));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(8));
+    __ mov(R0, Operand(8));
     __ vmovsr(S7, R0);
 
     __ vsubqi(kWord, Q2, Q1, Q0);
@@ -2294,9 +2294,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 10);
@@ -2314,13 +2314,13 @@
 
 ASSEMBLER_TEST_GENERATE(Vsubqi64, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S6, R0);
 
     __ vsubqi(kWordPair, Q2, Q1, Q0);
@@ -2328,7 +2328,7 @@
     __ vmovrs(R0, S8);
     __ vmovrs(R2, S10);
 
-    __ add(R0, R0, ShifterOperand(R2));
+    __ add(R0, R0, Operand(R2));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 3);
@@ -2346,21 +2346,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vmulqi8, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(5));
+    __ mov(R0, Operand(5));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(6));
+    __ mov(R0, Operand(6));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(7));
+    __ mov(R0, Operand(7));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(8));
+    __ mov(R0, Operand(8));
     __ vmovsr(S7, R0);
 
     __ vmulqi(kByte, Q2, Q1, Q0);
@@ -2370,9 +2370,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 70);
@@ -2390,21 +2390,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vmulqi16, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(5));
+    __ mov(R0, Operand(5));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(6));
+    __ mov(R0, Operand(6));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(7));
+    __ mov(R0, Operand(7));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(8));
+    __ mov(R0, Operand(8));
     __ vmovsr(S7, R0);
 
     __ vmulqi(kHalfword, Q2, Q1, Q0);
@@ -2414,9 +2414,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 70);
@@ -2434,21 +2434,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vmulqi32, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(5));
+    __ mov(R0, Operand(5));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(6));
+    __ mov(R0, Operand(6));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(7));
+    __ mov(R0, Operand(7));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(8));
+    __ mov(R0, Operand(8));
     __ vmovsr(S7, R0);
 
     __ vmulqi(kWord, Q2, Q1, Q0);
@@ -2458,9 +2458,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 70);
@@ -2777,9 +2777,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -8);
@@ -2819,9 +2819,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 60);
@@ -2861,9 +2861,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -4);
@@ -2903,9 +2903,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, 4);
@@ -2996,9 +2996,9 @@
     __ vmovrs(R2, S2);
     __ vmovrs(R3, S3);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -4);
@@ -3029,9 +3029,9 @@
     __ vmovrs(R2, S2);
     __ vmovrs(R3, S3);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -4);
@@ -3062,9 +3062,9 @@
     __ vmovrs(R2, S2);
     __ vmovrs(R3, S3);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -4);
@@ -3116,21 +3116,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vceqqi32, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(20));
+    __ mov(R0, Operand(20));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(40));
+    __ mov(R0, Operand(40));
     __ vmovsr(S7, R0);
 
     __ vceqqi(kWord, Q2, Q1, Q0);
@@ -3140,9 +3140,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -2);
@@ -3176,9 +3176,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -2);
@@ -3196,21 +3196,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vcgeqi32, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S7, R0);
 
     __ vcgeqi(kWord, Q2, Q1, Q0);
@@ -3220,9 +3220,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -2);
@@ -3240,21 +3240,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vcugeqi32, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
     __ LoadImmediate(R0, -1);
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S5, R0);
     __ LoadImmediate(R0, -3);
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S7, R0);
 
     __ vcugeqi(kWord, Q2, Q1, Q0);
@@ -3264,9 +3264,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -2);
@@ -3300,9 +3300,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -2);
@@ -3320,21 +3320,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vcgtqi32, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S5, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S7, R0);
 
     __ vcgtqi(kWord, Q2, Q1, Q0);
@@ -3344,9 +3344,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -2);
@@ -3364,21 +3364,21 @@
 
 ASSEMBLER_TEST_GENERATE(Vcugtqi32, assembler) {
   if (TargetCPUFeatures::neon_supported()) {
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S0, R0);
-    __ mov(R0, ShifterOperand(2));
+    __ mov(R0, Operand(2));
     __ vmovsr(S1, R0);
-    __ mov(R0, ShifterOperand(3));
+    __ mov(R0, Operand(3));
     __ vmovsr(S2, R0);
-    __ mov(R0, ShifterOperand(4));
+    __ mov(R0, Operand(4));
     __ vmovsr(S3, R0);
     __ LoadImmediate(R0, -1);
     __ vmovsr(S4, R0);
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S5, R0);
     __ LoadImmediate(R0, -3);
     __ vmovsr(S6, R0);
-    __ mov(R0, ShifterOperand(1));
+    __ mov(R0, Operand(1));
     __ vmovsr(S7, R0);
 
     __ vcugtqi(kWord, Q2, Q1, Q0);
@@ -3388,9 +3388,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -2);
@@ -3424,9 +3424,9 @@
     __ vmovrs(R2, S10);
     __ vmovrs(R3, S11);
 
-    __ add(R0, R0, ShifterOperand(R1));
-    __ add(R0, R0, ShifterOperand(R2));
-    __ add(R0, R0, ShifterOperand(R3));
+    __ add(R0, R0, Operand(R1));
+    __ add(R0, R0, Operand(R2));
+    __ add(R0, R0, Operand(R3));
     __ bx(LR);
   } else {
     __ LoadImmediate(R0, -2);
@@ -4068,7 +4068,7 @@
 // R2: growable array.
 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
   __ PushList((1 << CTX) | (1 << LR));
-  __ mov(CTX, ShifterOperand(R0));
+  __ mov(CTX, Operand(R0));
   __ StoreIntoObject(R2,
                      FieldAddress(R2, GrowableObjectArray::data_offset()),
                      R1);
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index a2f8a65..f219e8e 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -2087,7 +2087,7 @@
                                            Register value,
                                            Label* no_update) {
   COMPILE_ASSERT((kNewObjectAlignmentOffset == kWordSize) &&
-                 (kOldObjectAlignmentOffset == 0), young_alignment);
+                 (kOldObjectAlignmentOffset == 0));
 
   // Write-barrier triggers if the value is in the new space (has bit set) and
   // the object is in the old space (has bit cleared).
diff --git a/runtime/vm/assembler_ia32_test.cc b/runtime/vm/assembler_ia32_test.cc
index 99152cf..527ea82 100644
--- a/runtime/vm/assembler_ia32_test.cc
+++ b/runtime/vm/assembler_ia32_test.cc
@@ -710,9 +710,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(CallSimpleLeaf, assembler) {
-  ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42));
-  ExternalLabel call2("LeafReturnArgument",
-                      reinterpret_cast<uword>(LeafReturnArgument));
+  ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42));
+  ExternalLabel call2(reinterpret_cast<uword>(LeafReturnArgument));
   int space = ComputeStackSpaceReservation(0, 4);
   __ AddImmediate(ESP, Immediate(-space));
   __ call(&call1);
@@ -733,7 +732,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(JumpSimpleLeaf, assembler) {
-  ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42));
+  ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42));
   Label L;
   int space = ComputeStackSpaceReservation(0, 4);
   __ AddImmediate(ESP, Immediate(-space));
@@ -752,7 +751,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(JumpConditionalSimpleLeaf, assembler) {
-  ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42));
+  ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42));
   Label L;
   int space = ComputeStackSpaceReservation(0, 4);
   __ AddImmediate(ESP, Immediate(-space));
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index f26e32c..f4a4f6e 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -520,7 +520,7 @@
                                            Label* no_update) {
   ASSERT(!in_delay_slot_);
   COMPILE_ASSERT((kNewObjectAlignmentOffset == kWordSize) &&
-                 (kOldObjectAlignmentOffset == 0), young_alignment);
+                 (kOldObjectAlignmentOffset == 0));
 
   // Write-barrier triggers if the value is in the new space (has bit set) and
   // the object is in the old space (has bit cleared).
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index 2a4307b..efbb467 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -1116,6 +1116,10 @@
     sra(reg, reg, kSmiTagSize);
   }
 
+  void SmiUntag(Register dst, Register src) {
+    sra(dst, src, kSmiTagSize);
+  }
+
   void LoadFromOffset(Register reg, Register base, int32_t offset) {
     ASSERT(!in_delay_slot_);
     if (Utils::IsInt(kImmBits, offset)) {
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 727fb63..c04809e 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -2647,7 +2647,7 @@
                                            Register value,
                                            Label* no_update) {
   COMPILE_ASSERT((kNewObjectAlignmentOffset == kWordSize) &&
-                 (kOldObjectAlignmentOffset == 0), young_alignment);
+                 (kOldObjectAlignmentOffset == 0));
 
   // Write-barrier triggers if the value is in the new space (has bit set) and
   // the object is in the old space (has bit cleared).
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index 8892ed4..de4275f 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -1288,9 +1288,8 @@
 
 
 ASSEMBLER_TEST_GENERATE(CallSimpleLeaf, assembler) {
-  ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42));
-  ExternalLabel call2("LeafReturnArgument",
-                      reinterpret_cast<uword>(LeafReturnArgument));
+  ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42));
+  ExternalLabel call2(reinterpret_cast<uword>(LeafReturnArgument));
   int space = ComputeStackSpaceReservation(0, 8);
   __ subq(RSP, Immediate(space));
   __ call(&call1);
@@ -1311,7 +1310,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(JumpSimpleLeaf, assembler) {
-  ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42));
+  ExternalLabel call1(reinterpret_cast<uword>(LeafReturn42));
   Label L;
   int space = ComputeStackSpaceReservation(0, 8);
   __ subq(RSP, Immediate(space));
diff --git a/runtime/vm/ast.cc b/runtime/vm/ast.cc
index f144e4f..522e27e 100644
--- a/runtime/vm/ast.cc
+++ b/runtime/vm/ast.cc
@@ -12,6 +12,8 @@
 
 namespace dart {
 
+DECLARE_FLAG(bool, enable_type_checks);
+
 #define DEFINE_VISIT_FUNCTION(BaseName)                                        \
 void BaseName##Node::Visit(AstNodeVisitor* visitor) {                          \
   visitor->Visit##BaseName##Node(this);                                        \
@@ -505,6 +507,13 @@
   if (field().is_final()) {
     return NULL;
   }
+  if (FLAG_enable_type_checks) {
+    rhs = new AssignableNode(
+        field().token_pos(),
+        rhs,
+        AbstractType::ZoneHandle(field().type()),
+        String::ZoneHandle(field().name()));
+  }
   return new StoreStaticFieldNode(token_pos(), field(), rhs);
 }
 
@@ -557,6 +566,13 @@
     ASSERT(!getter.IsNull() &&
            (getter.kind() == RawFunction::kImplicitStaticFinalGetter));
 #endif
+    if (FLAG_enable_type_checks) {
+      rhs = new AssignableNode(
+          field.token_pos(),
+          rhs,
+          AbstractType::ZoneHandle(field.type()),
+          String::ZoneHandle(field.name()));
+    }
     return new StoreStaticFieldNode(token_pos(), field, rhs);
   }
   // Didn't find a static setter or a static field.
diff --git a/runtime/vm/ast_printer.cc b/runtime/vm/ast_printer.cc
index c1c957d..1c76c59 100644
--- a/runtime/vm/ast_printer.cc
+++ b/runtime/vm/ast_printer.cc
@@ -25,9 +25,6 @@
 
 
 void AstPrinter::VisitSequenceNode(SequenceNode* node) {
-  // TODO(regis): Make the output more readable by indenting the nested
-  // sequences. This could be achieved using a AstPrinterContext similar to the
-  // CodeGeneratorContext.
   OS::Print("(%s (scope \"%p\")", node->PrettyName(), node->scope());
   for (int i = 0; i < node->length(); ++i) {
     OS::Print("\n");
diff --git a/runtime/vm/block_scheduler.cc b/runtime/vm/block_scheduler.cc
index 99d4ba3..02287f3 100644
--- a/runtime/vm/block_scheduler.cc
+++ b/runtime/vm/block_scheduler.cc
@@ -58,8 +58,7 @@
 
 
 void BlockScheduler::AssignEdgeWeights() const {
-  const Code& unoptimized_code = Code::Handle(
-      flow_graph()->parsed_function().code());
+  const Code& unoptimized_code = flow_graph()->parsed_function().code();
   ASSERT(!unoptimized_code.IsNull());
 
   intptr_t entry_count =
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 569d531..811e24e 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -300,7 +300,6 @@
   V(InstanceMirror_invokeGetter, 3)                                            \
   V(InstanceMirror_invokeSetter, 4)                                            \
   V(InstanceMirror_computeType, 1)                                             \
-  V(ClosureMirror_find_in_context, 2)                                          \
   V(ClosureMirror_function, 1)                                                 \
   V(TypeMirror_subtypeTest, 2)                                                 \
   V(TypeMirror_moreSpecificTest, 2)                                            \
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index 3780f91..3dd4b98 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -35,7 +35,8 @@
   cls.SetFunctions(functions);
   Library& lib = Library::Handle(Library::CoreLibrary());
   lib.AddClass(cls);
-  ParsedFunction* parsed_function = new ParsedFunction(function);
+  ParsedFunction* parsed_function =
+      new ParsedFunction(Isolate::Current(), function);
   LiteralNode* l = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1)));
   test->node_sequence()->Add(new ReturnNode(kPos, l));
   l = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2)));
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index d841dbd..c4ba10b 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -40,8 +40,7 @@
                                                          1));
 
   __ LoadObject(R5, ic_data, PP);
-  ExternalLabel target_label(
-      "InlineCache", StubCode::OneArgCheckInlineCacheEntryPoint());
+  ExternalLabel target_label(StubCode::OneArgCheckInlineCacheEntryPoint());
   __ BranchLinkPatchable(&target_label);
   __ ret();
 }
diff --git a/runtime/vm/code_patcher_arm_test.cc b/runtime/vm/code_patcher_arm_test.cc
index f4f94f1..9dfa92d 100644
--- a/runtime/vm/code_patcher_arm_test.cc
+++ b/runtime/vm/code_patcher_arm_test.cc
@@ -40,8 +40,7 @@
                                                          1));
 
   __ LoadObject(R5, ic_data);
-  ExternalLabel target_label(
-      "InlineCache", StubCode::OneArgCheckInlineCacheEntryPoint());
+  ExternalLabel target_label(StubCode::OneArgCheckInlineCacheEntryPoint());
   __ BranchLinkPatchable(&target_label);
   __ Ret();
 }
diff --git a/runtime/vm/code_patcher_ia32_test.cc b/runtime/vm/code_patcher_ia32_test.cc
index 6047611..a1b7789 100644
--- a/runtime/vm/code_patcher_ia32_test.cc
+++ b/runtime/vm/code_patcher_ia32_test.cc
@@ -40,8 +40,7 @@
                                                          1));
 
   __ LoadObject(ECX, ic_data);
-  ExternalLabel target_label(
-      "InlineCache", StubCode::OneArgCheckInlineCacheEntryPoint());
+  ExternalLabel target_label(StubCode::OneArgCheckInlineCacheEntryPoint());
   __ call(&target_label);
   __ ret();
 }
diff --git a/runtime/vm/code_patcher_mips_test.cc b/runtime/vm/code_patcher_mips_test.cc
index ff2bff6..286d756 100644
--- a/runtime/vm/code_patcher_mips_test.cc
+++ b/runtime/vm/code_patcher_mips_test.cc
@@ -40,8 +40,7 @@
                                                          1));
 
   __ LoadObject(S5, ic_data);
-  ExternalLabel target_label(
-      "InlineCache", StubCode::OneArgCheckInlineCacheEntryPoint());
+  ExternalLabel target_label(StubCode::OneArgCheckInlineCacheEntryPoint());
   __ BranchLinkPatchable(&target_label);
   __ Ret();
 }
diff --git a/runtime/vm/code_patcher_x64_test.cc b/runtime/vm/code_patcher_x64_test.cc
index 11405b6..9ba8d1f 100644
--- a/runtime/vm/code_patcher_x64_test.cc
+++ b/runtime/vm/code_patcher_x64_test.cc
@@ -40,8 +40,7 @@
                                                          1));
 
   __ LoadObject(RBX, ic_data, PP);
-  ExternalLabel target_label(
-      "InlineCache", StubCode::OneArgCheckInlineCacheEntryPoint());
+  ExternalLabel target_label(StubCode::OneArgCheckInlineCacheEntryPoint());
   __ CallPatchable(&target_label);
   __ ret();
 }
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 31fa6f2..da3feb1 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -240,21 +240,6 @@
 }
 
 
-static void InstallUnoptimizedCode(const Function& function) {
-  // Disable optimized code.
-  ASSERT(function.HasOptimizedCode());
-  if (FLAG_trace_compiler) {
-    OS::Print("--> patching entry %#" Px "\n",
-              Code::Handle(function.CurrentCode()).EntryPoint());
-  }
-  function.SwitchToUnoptimizedCode();
-  if (FLAG_trace_compiler) {
-    OS::Print("--> restoring entry at %#" Px "\n",
-              Code::Handle(function.unoptimized_code()).EntryPoint());
-  }
-}
-
-
 // Return false if bailed out.
 static bool CompileParsedFunctionHelper(ParsedFunction* parsed_function,
                                         bool optimized,
@@ -772,19 +757,12 @@
   Isolate* isolate = Isolate::Current();
   StackZone zone(isolate);
   LongJumpScope jump;
-  // Make sure unoptimized code is not collected while we are compiling.
-  const Code& unoptimized_code = Code::ZoneHandle(function.unoptimized_code());
-  // Skips parsing if we need to only install unoptimized code.
-  if (!optimized && !unoptimized_code.IsNull()) {
-    InstallUnoptimizedCode(function);
-    return Error::null();
-  }
   if (setjmp(*jump.Set()) == 0) {
     TIMERSCOPE(isolate, time_compilation);
     Timer per_compile_timer(FLAG_trace_compiler, "Compilation time");
     per_compile_timer.Start();
-    ParsedFunction* parsed_function =
-        new ParsedFunction(Function::ZoneHandle(function.raw()));
+    ParsedFunction* parsed_function = new ParsedFunction(
+        isolate, Function::ZoneHandle(isolate, function.raw()));
     if (FLAG_trace_compiler) {
       OS::Print("Compiling %s%sfunction: '%s' @ token %" Pd ", size %" Pd "\n",
                 (osr_id == Isolate::kNoDeoptId ? "" : "osr "),
@@ -976,7 +954,7 @@
     // We compile the function here, even though InvokeStatic() below
     // would compile func automatically. We are checking fewer invariants
     // here.
-    ParsedFunction* parsed_function = new ParsedFunction(func);
+    ParsedFunction* parsed_function = new ParsedFunction(isolate, func);
     parsed_function->SetNodeSequence(fragment);
     parsed_function->set_default_parameter_values(Object::null_array());
     parsed_function->EnsureExpressionTemp();
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 46459b4..898c8a4 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -417,6 +417,7 @@
   ConditionalSelectFixed = DPRegisterFixed | B28 | B23,
   CSEL = ConditionalSelectFixed,
   CSINC = ConditionalSelectFixed | B10,
+  CSINV = ConditionalSelectFixed | B30,
 };
 
 // C3.5.8
@@ -484,6 +485,18 @@
   VMULD = SIMDThreeSameFixed | B30 | B29 | B22 | B15 | B14 | B12 | B11,
   VDIVS = SIMDThreeSameFixed | B30 | B29 | B15 | B14 | B13 | B12 | B11,
   VDIVD = SIMDThreeSameFixed | B30 | B29 | B22 | B15 | B14 | B13 | B12 | B11,
+  VCEQS = SIMDThreeSameFixed | B30 | B15 | B14 | B13,
+  VCEQD = SIMDThreeSameFixed | B30 | B22 | B15 | B14 | B13,
+  VCGES = SIMDThreeSameFixed | B30 | B29 | B15 | B14 | B13,
+  VCGED = SIMDThreeSameFixed | B30 | B29 | B22 | B15 | B14 | B13,
+  VCGTS = SIMDThreeSameFixed | B30 | B29 | B23 | B15 | B14 | B13,
+  VCGTD = SIMDThreeSameFixed | B30 | B29 | B23 | B22 | B15 | B14 | B13,
+  VMAXS = SIMDThreeSameFixed | B30 | B15 | B14 | B13 | B12,
+  VMAXD = SIMDThreeSameFixed | B30 | B22 | B15 | B14 | B13 | B12,
+  VMINS = SIMDThreeSameFixed | B30 | B23 | B15 | B14 | B13 | B12,
+  VMIND = SIMDThreeSameFixed | B30 | B23 | B22 | B15 | B14 | B13 | B12,
+  VRECPSS = SIMDThreeSameFixed | B30 | B15 | B14 | B13 | B12 | B11,
+  VRSQRTSS = SIMDThreeSameFixed | B30 | B23 | B15 | B14 | B13 | B12 | B11,
 };
 
 // C.3.6.17
@@ -495,6 +508,11 @@
   VNEGS = SIMDTwoRegFixed | B30 | B29 | B23 | B15 | B14 | B13 | B12,
   VABSD = SIMDTwoRegFixed | B30 | B23 | B22 | B15 | B14 | B13 | B12,
   VNEGD = SIMDTwoRegFixed | B30 | B29 | B23 | B22 | B15 | B14 | B13 | B12,
+  VSQRTS = SIMDTwoRegFixed | B30 | B29 | B23 | B16 | B15 | B14 | B13 | B12,
+  VSQRTD = SIMDTwoRegFixed | B30 | B29 | B23 | B22
+                           | B16 | B15 | B14 | B13 | B12,
+  VRECPES = SIMDTwoRegFixed | B30 | B23 | B16 | B15 | B14 | B12,
+  VRSQRTES = SIMDTwoRegFixed | B30 | B29 | B23 | B16 | B15 | B14 | B12,
 };
 
 // C.3.6.22
diff --git a/runtime/vm/cpu_arm64.cc b/runtime/vm/cpu_arm64.cc
index 4e6a1d4..c717a70 100644
--- a/runtime/vm/cpu_arm64.cc
+++ b/runtime/vm/cpu_arm64.cc
@@ -18,10 +18,27 @@
 namespace dart {
 
 void CPU::FlushICache(uword start, uword size) {
-#if defined(USING_SIMULATOR)
-  // Nothing to do.
-#else
-  UNIMPLEMENTED();
+#if defined(HOST_ARCH_ARM64)
+  // Nothing to do. Flushing no instructions.
+  if (size == 0) {
+    return;
+  }
+
+  // ARM recommends using the gcc intrinsic __clear_cache on Linux, and the
+  // library call cacheflush from unistd.h on Android:
+  // blogs.arm.com/software-enablement/141-caches-and-self-modifying-code/
+  #if defined(__linux__) && !defined(ANDROID)
+    extern void __clear_cache(char*, char*);
+    char* beg = reinterpret_cast<char*>(start);
+    char* end = reinterpret_cast<char*>(start + size);
+    ::__clear_cache(beg, end);
+  #elif defined(ANDROID)
+    // TODO(zra): Verify that this is correct for arm64 in addition to arm.
+    cacheflush(start, start + size, 0);
+  #else
+    #error FlushICache only tested/supported on Linux and Android
+  #endif
+
 #endif
 }
 
diff --git a/runtime/vm/cpuinfo_linux.cc b/runtime/vm/cpuinfo_linux.cc
index e96e0d5..77ace90 100644
--- a/runtime/vm/cpuinfo_linux.cc
+++ b/runtime/vm/cpuinfo_linux.cc
@@ -35,7 +35,8 @@
   fields_[kCpuInfoFeatures] = "Features";
   method_ = kCpuInfoSystem;
   ProcCpuInfo::InitOnce();
-#elif defined(HOST_ARCH_MIPS)
+#elif defined(HOST_ARCH_MIPS) || defined(HOST_ARCH_ARM64)
+// TODO(zra): Verify that these field names are correct for arm64.
   fields_[kCpuInfoProcessor] = "system type";
   fields_[kCpuInfoModel] = "cpu model";
   fields_[kCpuInfoHardware] = "cpu model";
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 4c04cba..6c89434 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -25,6 +25,7 @@
 #include "vm/object.h"
 #include "vm/object_store.h"
 #include "vm/port.h"
+#include "vm/profiler.h"
 #include "vm/resolver.h"
 #include "vm/reusable_handles.h"
 #include "vm/service.h"
@@ -1313,6 +1314,28 @@
 }
 
 
+DART_EXPORT void Dart_IsolateBlocked() {
+  Isolate* isolate = Isolate::Current();
+  CHECK_ISOLATE(isolate);
+  IsolateProfilerData* profiler_data = isolate->profiler_data();
+  if (profiler_data == NULL) {
+    return;
+  }
+  profiler_data->Block();
+}
+
+
+DART_EXPORT void Dart_IsolateUnblocked() {
+  Isolate* isolate = Isolate::Current();
+  CHECK_ISOLATE(isolate);
+  IsolateProfilerData* profiler_data = isolate->profiler_data();
+  if (profiler_data == NULL) {
+    return;
+  }
+  profiler_data->Unblock();
+}
+
+
 DART_EXPORT void Dart_ExitIsolate() {
   CHECK_ISOLATE(Isolate::Current());
   Isolate::SetCurrent(NULL);
@@ -2663,12 +2686,11 @@
   }                                                                            \
   return Api::NewError("Invalid length passed in to access array elements");   \
 
-
-static Dart_Handle CopyBytes(const TypedData& array,
+template<typename T>
+static Dart_Handle CopyBytes(const T& array,
                              intptr_t offset,
                              uint8_t* native_array,
                              intptr_t length) {
-  ASSERT(array.IsTypedData());
   ASSERT(array.ElementSizeInBytes() == 1);
   NoGCScope no_gc;
   memmove(native_array,
@@ -2695,6 +2717,16 @@
       return CopyBytes(array, offset, native_array, length);
     }
   }
+  if (obj.IsExternalTypedData()) {
+    const ExternalTypedData& external_array = ExternalTypedData::Cast(obj);
+    if (external_array.ElementSizeInBytes() == 1) {
+      if (!Utils::RangeCheck(offset, length, external_array.Length())) {
+        return Api::NewError(
+            "Invalid length passed in to access list elements");
+      }
+      return CopyBytes(external_array, offset, native_array, length);
+    }
+  }
   if (RawObject::IsTypedDataViewClassId(obj.GetClassId())) {
     const Instance& view = Instance::Cast(obj);
     if (TypedDataView::ElementSizeInBytes(view) == 1) {
diff --git a/runtime/vm/disassembler_arm64.cc b/runtime/vm/disassembler_arm64.cc
index 04f5b6c..d04a941 100644
--- a/runtime/vm/disassembler_arm64.cc
+++ b/runtime/vm/disassembler_arm64.cc
@@ -540,7 +540,7 @@
     case 'v': {
       if (format[1] == 's') {
         ASSERT(STRING_STARTS_WITH(format, "vsz"));
-        char const* sz_str;
+        char const* sz_str = NULL;
         if (instr->Bits(14, 2) == 3) {
           switch (instr->Bit(22)) {
             case 0: sz_str = "s"; break;
@@ -1008,6 +1008,8 @@
     Format(instr, "mov'sf'cond 'rd, 'rn, 'rm");
   } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 1)) {
     Format(instr, "csinc'sf'cond 'rd, 'rn, 'rm");
+  } else if ((instr->Bits(29, 2) == 2) && (instr->Bits(10, 2) == 0)) {
+    Format(instr, "csinv'sf'cond 'rd, 'rn, 'rm");
   } else {
     Unknown(instr);
   }
@@ -1088,6 +1090,26 @@
     Format(instr, "vmul'vsz 'vd, 'vn, 'vm");
   } else if ((U == 1) && (opcode == 0x1f)) {
     Format(instr, "vdiv'vsz 'vd, 'vn, 'vm");
+  } else if ((U == 0) && (opcode == 0x1c)) {
+    Format(instr, "vceq'vsz 'vd, 'vn, 'vm");
+  } else if ((U == 1) && (opcode == 0x1c)) {
+    if (instr->Bit(23) == 1) {
+      Format(instr, "vcgt'vsz 'vd, 'vn, 'vm");
+    } else {
+      Format(instr, "vcge'vsz 'vd, 'vn, 'vm");
+    }
+  } else if ((U == 0) && (opcode == 0x1e)) {
+    if (instr->Bit(23) == 1) {
+      Format(instr, "vmin'vsz 'vd, 'vn, 'vm");
+    } else {
+      Format(instr, "vmax'vsz 'vd, 'vn, 'vm");
+    }
+  } else if ((U == 0) && (opcode == 0x1f)) {
+    if (instr->Bit(23) == 1) {
+      Format(instr, "vrsqrt'vsz 'vd, 'vn, 'vm");
+    } else {
+      Format(instr, "vrecps'vsz 'vd, 'vn, 'vm");
+    }
   } else {
     Unknown(instr);
   }
@@ -1123,6 +1145,26 @@
     } else {
       Unknown(instr);
     }
+  } else if ((U == 1) && (op == 0x1f)) {
+    if (sz == 2) {
+      Format(instr, "vsqrts 'vd, 'vn");
+    } else if (sz == 3) {
+      Format(instr, "vsqrtd 'vd, 'vn");
+    } else {
+      Unknown(instr);
+    }
+  } else if ((U == 0) && (op == 0x1d)) {
+    if (sz != 2) {
+      Unknown(instr);
+      return;
+    }
+    Format(instr, "vrecpes 'vd, 'vn");
+  } else if ((U == 1) && (op == 0x1d)) {
+    if (sz != 2) {
+      Unknown(instr);
+      return;
+    }
+    Format(instr, "vrsqrtes 'vd, 'vn");
   } else {
     Unknown(instr);
   }
diff --git a/runtime/vm/flags.cc b/runtime/vm/flags.cc
index 2c3cb13..a270344 100644
--- a/runtime/vm/flags.cc
+++ b/runtime/vm/flags.cc
@@ -5,6 +5,7 @@
 #include "vm/flags.h"
 
 #include "platform/assert.h"
+#include "vm/json_stream.h"
 #include "vm/os.h"
 
 namespace dart {
@@ -13,11 +14,13 @@
 DEFINE_FLAG(bool, ignore_unrecognized_flags, false,
     "Ignore unrecognized flags.");
 
-// List of registered flags.
-Flag* Flags::flags_ = NULL;
-
 bool Flags::initialized_ = false;
 
+// List of registered flags.
+Flag** Flags::flags_ = NULL;
+intptr_t Flags::capacity_ = 0;
+intptr_t Flags::num_flags_ = 0;
+
 class Flag {
  public:
   enum FlagType {
@@ -72,7 +75,6 @@
     return (type_ == kBoolean) && (bool_ptr_ == NULL);
   }
 
-  Flag* next_;
   const char* name_;
   const char* comment_;
   union {
@@ -83,16 +85,16 @@
     FlagHandler handler_;
   };
   FlagType type_;
+  bool changed_;
 };
 
 
 Flag* Flags::Lookup(const char* name) {
-  Flag* cur = Flags::flags_;
-  while (cur != NULL) {
-    if (strcmp(cur->name_, name) == 0) {
-      return cur;
+  for (intptr_t i = 0; i < num_flags_; i++) {
+    Flag* flag = flags_[i];
+    if (strcmp(flag->name_, name) == 0) {
+      return flag;
     }
-    cur = cur->next_;
   }
   return NULL;
 }
@@ -107,6 +109,27 @@
 }
 
 
+void Flags::AddFlag(Flag* flag) {
+  ASSERT(!initialized_);
+  if (num_flags_ == capacity_) {
+    if (flags_ == NULL) {
+      capacity_ = 256;
+      flags_ = new Flag*[capacity_];
+    } else {
+      intptr_t new_capacity = capacity_ * 2;
+      Flag** new_flags = new Flag*[new_capacity];
+      for (intptr_t i = 0; i < num_flags_; i++) {
+        new_flags[i] = flags_[i];
+      }
+      delete [] flags_;
+      flags_ = new_flags;
+      capacity_ = new_capacity;
+    }
+  }
+  flags_[num_flags_++] = flag;
+}
+
+
 bool Flags::Register_bool(bool* addr,
                           const char* name,
                           bool default_value,
@@ -117,9 +140,7 @@
     return default_value;
   }
   flag = new Flag(name, comment, addr, Flag::kBoolean);
-  flag->next_ = Flags::flags_;
-  Flags::flags_ = flag;
-
+  AddFlag(flag);
   return default_value;
 }
 
@@ -131,8 +152,7 @@
   ASSERT(Lookup(name) == NULL);
 
   Flag* flag = new Flag(name, comment, addr, Flag::kInteger);
-  flag->next_ = Flags::flags_;
-  Flags::flags_ = flag;
+  AddFlag(flag);
 
   return default_value;
 }
@@ -144,8 +164,7 @@
                                   const char* comment) {
   ASSERT(Lookup(name) == NULL);
   Flag* flag = new Flag(name, comment, addr, Flag::kString);
-  flag->next_ = Flags::flags_;
-  Flags::flags_ = flag;
+  AddFlag(flag);
   return default_value;
 }
 
@@ -155,8 +174,7 @@
                           const char* comment) {
   ASSERT(Lookup(name) == NULL);
   Flag* flag = new Flag(name, comment, handler);
-  flag->next_ = Flags::flags_;
-  Flags::flags_ = flag;
+  AddFlag(flag);
   return false;
 }
 
@@ -171,6 +189,51 @@
 }
 
 
+bool Flags::SetFlagFromString(Flag* flag, const char* argument) {
+  ASSERT(!flag->IsUnrecognized());
+  switch (flag->type_) {
+    case Flag::kBoolean: {
+      if (strcmp(argument, "true") == 0) {
+        *flag->bool_ptr_ = true;
+      } else if (strcmp(argument, "false") == 0) {
+        *flag->bool_ptr_ = false;
+      } else {
+        return false;
+      }
+      break;
+    }
+    case Flag::kString: {
+      *flag->charp_ptr_ = argument == NULL ? NULL : strdup(argument);
+      break;
+    }
+    case Flag::kInteger: {
+      char* endptr = NULL;
+      int val = strtol(argument, &endptr, 10);
+      if (endptr != argument) {
+        *flag->int_ptr_ = val;
+      }
+      break;
+    }
+    case Flag::kFunc: {
+      if (strcmp(argument, "true") == 0) {
+        (flag->handler_)(true);
+      } else if (strcmp(argument, "false") == 0) {
+        (flag->handler_)(false);
+      } else {
+        return false;
+      }
+      break;
+    }
+    default: {
+      UNREACHABLE();
+      return false;
+    }
+  }
+  flag->changed_ = true;
+  return true;
+}
+
+
 void Flags::Parse(const char* option) {
   // Find the beginning of the option argument, if it exists.
   const char* equals = option;
@@ -220,43 +283,9 @@
     // Only set values for recognized flags, skip collected
     // unrecognized flags.
     if (!flag->IsUnrecognized()) {
-      switch (flag->type_) {
-        case Flag::kBoolean: {
-          if (strcmp(argument, "true") == 0) {
-            *flag->bool_ptr_ = true;
-          } else if (strcmp(argument, "false") == 0) {
-            *flag->bool_ptr_ = false;
-          } else {
-            OS::Print("Ignoring flag: %s is a bool flag.\n", name);
-          }
-          break;
-        }
-        case Flag::kString: {
-          *flag->charp_ptr_ = argument == NULL ? NULL : strdup(argument);
-          break;
-        }
-        case Flag::kInteger: {
-          char* endptr = NULL;
-          int val = strtol(argument, &endptr, 10);
-          if (endptr != argument) {
-            *flag->int_ptr_ = val;
-          }
-          break;
-        }
-        case Flag::kFunc: {
-          if (strcmp(argument, "true") == 0) {
-            (flag->handler_)(true);
-          } else if (strcmp(argument, "false") == 0) {
-            (flag->handler_)(false);
-          } else {
-            OS::Print("Ignoring flag: %s is a bool flag.\n", name);
-          }
-          break;
-        }
-        default: {
-          UNREACHABLE();
-          break;
-        }
+      if (!SetFlagFromString(flag, argument)) {
+        OS::Print("Ignoring flag: %s is an invalid value for flag %s\n",
+                  argument, name);
       }
     }
   }
@@ -274,13 +303,20 @@
 }
 
 
+int Flags::CompareFlagNames(const void* left, const void* right) {
+  const Flag* left_flag = *reinterpret_cast<const Flag* const *>(left);
+  const Flag* right_flag = *reinterpret_cast<const Flag* const *>(right);
+  return strcmp(left_flag->name_, right_flag->name_);
+}
+
+
 bool Flags::ProcessCommandLineFlags(int number_of_vm_flags,
                                     const char** vm_flags) {
   if (initialized_) {
     return false;
   }
 
-  initialized_ = true;
+  qsort(flags_, num_flags_, sizeof flags_[0], CompareFlagNames);
 
   const char* kPrefix = "--";
   const intptr_t kPrefixLen = strlen(kPrefix);
@@ -295,8 +331,8 @@
 
   if (!FLAG_ignore_unrecognized_flags) {
     int unrecognized_count = 0;
-    Flag* flag = Flags::flags_;
-    while (flag != NULL) {
+    for (intptr_t j = 0; j < num_flags_; j++) {
+      Flag* flag = flags_[j];
       if (flag->IsUnrecognized()) {
         if (unrecognized_count == 0) {
           OS::PrintErr("Unrecognized flags: %s", flag->name_);
@@ -305,7 +341,6 @@
         }
         unrecognized_count++;
       }
-      flag = flag->next_;
     }
     if (unrecognized_count > 0) {
       OS::PrintErr("\n");
@@ -315,36 +350,93 @@
   if (FLAG_print_flags) {
     PrintFlags();
   }
+
+  initialized_ = true;
+  return true;
+}
+
+bool Flags::SetFlag(const char* name,
+                    const char* value,
+                    const char** error) {
+  Flag* flag = Lookup(name);
+  if (flag == NULL) {
+    *error = "Cannot set flag: flag not found";
+    return false;
+  }
+  if (!SetFlagFromString(flag, value)) {
+    *error = "Cannot set flag: invalid value";
+    return false;
+  }
   return true;
 }
 
 
-int Flags::CompareFlagNames(const void* left, const void* right) {
-  const Flag* left_flag = *reinterpret_cast<const Flag* const *>(left);
-  const Flag* right_flag = *reinterpret_cast<const Flag* const *>(right);
-  return strcmp(left_flag->name_, right_flag->name_);
+void Flags::PrintFlags() {
+  OS::Print("Flag settings:\n");
+  for (intptr_t i = 0; i < num_flags_; ++i) {
+    flags_[i]->Print();
+  }
 }
 
 
-void Flags::PrintFlags() {
-    OS::Print("Flag settings:\n");
-    Flag* flag = Flags::flags_;
-    int num_flags = 0;
-    while (flag != NULL) {
-      num_flags++;
-      flag = flag->next_;
-    }
-    Flag** flag_array = new Flag*[num_flags];
-    flag = Flags::flags_;
-    for (int i = 0; i < num_flags; ++i, flag = flag->next_) {
-      flag_array[i] = flag;
-    }
-
-    qsort(flag_array, num_flags, sizeof flag_array[0], CompareFlagNames);
-
-    for (int i = 0; i < num_flags; ++i) {
-      flag_array[i]->Print();
-    }
-    delete[] flag_array;
+void Flags::PrintFlagToJSONArray(JSONArray* jsarr, const Flag* flag) {
+  if (flag->IsUnrecognized() || flag->type_ == Flag::kFunc) {
+    return;
   }
+  JSONObject jsflag(jsarr);
+  jsflag.AddProperty("name", flag->name_);
+  jsflag.AddProperty("comment", flag->comment_);
+  switch (flag->type_) {
+    case Flag::kBoolean: {
+      jsflag.AddProperty("flagType", "bool");
+      jsflag.AddProperty("valueAsString",
+                         (*flag->bool_ptr_ ? "true" : "false"));
+      break;
+    }
+    case Flag::kInteger: {
+      jsflag.AddProperty("flagType", "int");
+      jsflag.AddPropertyF("valueAsString", "%d", *flag->int_ptr_);
+      break;
+    }
+    case Flag::kString: {
+      jsflag.AddProperty("flagType", "string");
+      if (flag->charp_ptr_ != NULL) {
+        jsflag.AddPropertyF("valueAsString", "%s", *flag->charp_ptr_);
+      } else {
+        // valueAsString missing means NULL.
+      }
+      break;
+    }
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void Flags::PrintJSON(JSONStream* js) {
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "FlagList");
+  jsobj.AddProperty("id", "flags");
+
+  {
+    JSONArray jsarr(&jsobj, "unmodifiedFlags");
+    for (intptr_t i = 0; i < num_flags_; ++i) {
+      Flag* flag = flags_[i];
+      if (!flag->changed_) {
+        PrintFlagToJSONArray(&jsarr, flag);
+      }
+    }
+  }
+  {
+    JSONArray jsarr(&jsobj, "modifiedFlags");
+    for (intptr_t i = 0; i < num_flags_; ++i) {
+      Flag* flag = flags_[i];
+      if (flag->changed_) {
+        PrintFlagToJSONArray(&jsarr, flag);
+      }
+    }
+  }
+}
+
 }  // namespace dart
diff --git a/runtime/vm/flags.h b/runtime/vm/flags.h
index b4bee00..2fbec8f 100644
--- a/runtime/vm/flags.h
+++ b/runtime/vm/flags.h
@@ -36,8 +36,10 @@
 
 typedef void (*FlagHandler)(bool value);
 
-// Forward declaration.
+// Forward declarations.
 class Flag;
+class JSONArray;
+class JSONStream;
 
 class Flags {
  public:
@@ -68,17 +70,31 @@
 
   static bool Initialized() { return initialized_; }
 
+  static void PrintJSON(JSONStream* js);
+
+  static bool SetFlag(const char* name,
+                      const char* value,
+                      const char** error);
+
  private:
-  static Flag* flags_;
+  static Flag** flags_;
+  static intptr_t capacity_;
+  static intptr_t num_flags_;
 
   static bool initialized_;
 
+  static void AddFlag(Flag* flag);
+
+  static bool SetFlagFromString(Flag* flag, const char* argument);
+
   static void Parse(const char* option);
 
   static int CompareFlagNames(const void* left, const void* right);
 
   static void PrintFlags();
 
+  static void PrintFlagToJSONArray(JSONArray* jsarr, const Flag* flag);
+
   // Testing needs direct access to private methods.
   friend void Dart_TestParseFlags();
 
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index bc4e956..afaffa1 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -759,7 +759,7 @@
       Environment::From(isolate(),
                         *env,
                         num_non_copied_params_,
-                        Code::Handle(parsed_function_.code()));
+                        &parsed_function_);
   // TODO(fschneider): Add predicates CanEagerlyDeoptimize and
   // CanLazilyDeoptimize to instructions to generally deal with instructions
   // that have pushed arguments and input operands.
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 887d111..ca4b604 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -46,6 +46,8 @@
 DECLARE_FLAG(bool, silent_warnings);
 DECLARE_FLAG(bool, warning_as_error);
 
+// Quick access to the locally defined isolate() method.
+#define I (isolate())
 
 // TODO(srdjan): Allow compiler to add constants as they are encountered in
 // the compilation.
@@ -746,7 +748,7 @@
     Value* context = Bind(new CurrentContextInstr());
     while (delta-- > 0) {
       context = Bind(new LoadFieldInstr(
-          context, Context::parent_offset(), Type::ZoneHandle(),
+          context, Context::parent_offset(), Type::ZoneHandle(I, Type::null()),
           Scanner::kNoSourcePos));
     }
     Value* tmp_val = Bind(new LoadLocalInstr(*tmp_var));
@@ -774,7 +776,7 @@
     Value* context = Bind(new CurrentContextInstr());
     while (delta-- > 0) {
       context = Bind(new LoadFieldInstr(
-          context, Context::parent_offset(), Type::ZoneHandle(),
+          context, Context::parent_offset(), Type::ZoneHandle(I, Type::null()),
           Scanner::kNoSourcePos));
     }
     return new LoadFieldInstr(context,
@@ -1021,7 +1023,7 @@
     // However, factories may create an instance of the wrong type.
     if (!is_implicit_dynamic_getter && !function.IsConstructor()) {
       const AbstractType& dst_type =
-          AbstractType::ZoneHandle(function.result_type());
+          AbstractType::ZoneHandle(I, function.result_type());
       return_value = BuildAssignableValue(node->value()->token_pos(),
                                           return_value,
                                           dst_type,
@@ -1064,7 +1066,7 @@
     ReturnDefinition(new ConstantInstr(type));
   } else {
     const Class& instantiator_class = Class::ZoneHandle(
-        owner()->parsed_function()->function().Owner());
+        I, owner()->parsed_function()->function().Owner());
     Value* instantiator_value = BuildInstantiatorTypeArguments(
         node->token_pos(), instantiator_class, NULL);
     ReturnDefinition(new InstantiateTypeInstr(
@@ -1201,7 +1203,7 @@
       new ZoneGrowableArray<PushArgumentInstr*>(2);
   arguments->Add(push_left);
   arguments->Add(push_right);
-  const String& name = String::ZoneHandle(Symbols::New(node->TokenName()));
+  const String& name = String::ZoneHandle(I, Symbols::New(node->TokenName()));
   const intptr_t kNumArgsChecked = 2;
   InstanceCallInstr* call = new InstanceCallInstr(node->token_pos(),
                                                   name,
@@ -1268,7 +1270,7 @@
     return Library::PrivateCoreLibName(Symbols::_leftShiftWithMask32());
   }
   UNIMPLEMENTED();
-  return String::ZoneHandle();
+  return String::ZoneHandle(Isolate::Current(), String::null());
 }
 
 
@@ -1290,7 +1292,7 @@
   PushArgumentInstr* push_right = PushArgument(for_right_value.value());
 
   Value* mask_value = Bind(new ConstantInstr(
-      Integer::ZoneHandle(Integer::New(node->mask32(), Heap::kOld))));
+      Integer::ZoneHandle(I, Integer::New(node->mask32(), Heap::kOld))));
   PushArgumentInstr* push_mask = PushArgument(mask_value);
 
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
@@ -1316,7 +1318,7 @@
     PushArgumentInstr** push_instantiator_result,
     PushArgumentInstr** push_instantiator_type_arguments_result) {
   const Class& instantiator_class = Class::Handle(
-      owner()->parsed_function()->function().Owner());
+      I, owner()->parsed_function()->function().Owner());
   // Since called only when type tested against is not instantiated.
   ASSERT(instantiator_class.NumTypeParameters() > 0);
   Value* instantiator_type_arguments = NULL;
@@ -1346,7 +1348,7 @@
   Value* instantiator = NULL;
   Value* instantiator_type_arguments = NULL;
   const Class& instantiator_class = Class::Handle(
-      owner()->parsed_function()->function().Owner());
+      I, owner()->parsed_function()->function().Owner());
   // Since called only when type tested against is not instantiated.
   ASSERT(instantiator_class.NumTypeParameters() > 0);
   instantiator = BuildInstantiator(instantiator_class);
@@ -1368,7 +1370,7 @@
 
 
 Value* EffectGraphVisitor::BuildNullValue() {
-  return Bind(new ConstantInstr(Object::ZoneHandle()));
+  return Bind(new ConstantInstr(Object::ZoneHandle(I, Object::null())));
 }
 
 
@@ -1449,7 +1451,7 @@
   ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
   const bool negate_result = (node->kind() == Token::kISNOT);
   // All objects are instances of type T if Object type is a subtype of type T.
-  const Type& object_type = Type::Handle(Type::ObjectType());
+  const Type& object_type = Type::Handle(I, Type::ObjectType());
   if (type.IsInstantiated() && object_type.IsSubtypeOf(type, NULL)) {
     // Must evaluate left side.
     EffectGraphVisitor for_left_value(owner());
@@ -1518,7 +1520,7 @@
   node->left()->Visit(&for_value);
   Append(for_value);
   const String& dst_name = String::ZoneHandle(
-      Symbols::New(Exceptions::kCastErrorDstName));
+      I, Symbols::New(Exceptions::kCastErrorDstName));
   if (CanSkipTypeCheck(node->token_pos(),
                        for_value.value(),
                        type,
@@ -1665,7 +1667,8 @@
   ASSERT(Token::IsRelationalOperator(node->kind()));
   InstanceCallInstr* comp =
       new InstanceCallInstr(node->token_pos(),
-                            String::ZoneHandle(Symbols::New(node->TokenName())),
+                            String::ZoneHandle(
+                                I, Symbols::New(node->TokenName())),
                             node->kind(),
                             arguments,
                             Object::null_array(),
@@ -1700,7 +1703,8 @@
   arguments->Add(push_value);
   InstanceCallInstr* call =
       new InstanceCallInstr(node->token_pos(),
-                            String::ZoneHandle(Symbols::New(node->TokenName())),
+                            String::ZoneHandle(
+                                I, Symbols::New(node->TokenName())),
                             node->kind(),
                             arguments,
                             Object::null_array(),
@@ -2101,7 +2105,7 @@
   OS::SNPrint(name, 64, ":tmp_local%" Pd, index);
   LocalVariable*  var =
       new LocalVariable(0,
-                        String::ZoneHandle(Symbols::New(name)),
+                        String::ZoneHandle(I, Symbols::New(name)),
                         *value->Type()->ToAbstractType());
   var->set_index(index);
   return var;
@@ -2175,11 +2179,11 @@
 
 void EffectGraphVisitor::VisitArrayNode(ArrayNode* node) {
   const TypeArguments& type_args =
-      TypeArguments::ZoneHandle(node->type().arguments());
+      TypeArguments::ZoneHandle(I, node->type().arguments());
   Value* element_type = BuildInstantiatedTypeArguments(node->token_pos(),
                                                        type_args);
   Value* num_elements =
-      Bind(new ConstantInstr(Smi::ZoneHandle(Smi::New(node->length()))));
+      Bind(new ConstantInstr(Smi::ZoneHandle(I, Smi::New(node->length()))));
   CreateArrayInstr* create = new CreateArrayInstr(node->token_pos(),
                                                   element_type,
                                                   num_elements);
@@ -2190,7 +2194,7 @@
     const intptr_t deopt_id = Isolate::kNoDeoptId;
     for (int i = 0; i < node->length(); ++i) {
       Value* array = Bind(new LoadLocalInstr(*tmp_var));
-      Value* index = Bind(new ConstantInstr(Smi::ZoneHandle(Smi::New(i))));
+      Value* index = Bind(new ConstantInstr(Smi::ZoneHandle(I, Smi::New(i))));
       ValueGraphVisitor for_value(owner());
       node->ElementAt(i)->Visit(&for_value);
       Append(for_value);
@@ -2226,7 +2230,7 @@
 
   if (function.IsImplicitStaticClosureFunction()) {
     const Instance& closure =
-        Instance::ZoneHandle(function.ImplicitStaticClosure());
+        Instance::ZoneHandle(I, function.ImplicitStaticClosure());
     ReturnDefinition(new ConstantInstr(closure));
     return;
   }
@@ -2237,12 +2241,12 @@
   if (function.context_scope() == ContextScope::null()) {
     ASSERT(!is_implicit);
     const ContextScope& context_scope = ContextScope::ZoneHandle(
-        node->scope()->PreserveOuterScope(owner()->context_level()));
+        I, node->scope()->PreserveOuterScope(owner()->context_level()));
     ASSERT(!function.HasCode());
     ASSERT(function.context_scope() == ContextScope::null());
     function.set_context_scope(context_scope);
     const Class& cls = Class::Handle(
-        owner()->parsed_function()->function().Owner());
+        I, owner()->parsed_function()->function().Owner());
     // The closure is now properly setup, add it to the lookup table.
     // It is possible that the compiler creates more than one function
     // object for the same closure, e.g. when inlining nodes from
@@ -2254,7 +2258,7 @@
     // parent, and one with a closurized parent function.
 
     const Function& found_func = Function::Handle(
-        cls.LookupClosureFunction(function.token_pos()));
+        I, cls.LookupClosureFunction(function.token_pos()));
 
     if (found_func.IsNull() ||
         (found_func.token_pos() != function.token_pos()) ||
@@ -2269,7 +2273,7 @@
 
   // The function type of a closure may have type arguments. In that case,
   // pass the type arguments of the instantiator.
-  const Class& cls = Class::ZoneHandle(function.signature_class());
+  const Class& cls = Class::ZoneHandle(I, function.signature_class());
   ASSERT(!cls.IsNull());
   const bool requires_type_arguments = cls.NumTypeArguments() > 0;
   Value* type_arguments = NULL;
@@ -2278,7 +2282,7 @@
            Closure::type_arguments_offset());
     ASSERT(cls.instance_size() == Closure::InstanceSize());
     const Class& instantiator_class = Class::Handle(
-        owner()->parsed_function()->function().Owner());
+        I, owner()->parsed_function()->function().Owner());
     type_arguments = BuildInstantiatorTypeArguments(node->token_pos(),
                                                     instantiator_class,
                                                     NULL);
@@ -2294,7 +2298,7 @@
     // Store function.
     Value* closure_tmp_val = Bind(new LoadLocalInstr(*closure_tmp_var));
     Value* func_val =
-        Bind(new ConstantInstr(Function::ZoneHandle(function.raw())));
+        Bind(new ConstantInstr(Function::ZoneHandle(I, function.raw())));
     Do(new StoreInstanceFieldInstr(Closure::function_offset(),
                                    closure_tmp_val,
                                    func_val,
@@ -2451,19 +2455,20 @@
   ASSERT(owner()->parsed_function()->saved_current_context_var() != NULL);
   BuildSaveContext(*owner()->parsed_function()->saved_current_context_var());
   closure_val = Bind(new LoadLocalInstr(*tmp_var));
-  LoadFieldInstr* context_load = new LoadFieldInstr(closure_val,
-                                                    Closure::context_offset(),
-                                                    AbstractType::ZoneHandle(),
-                                                    node->token_pos());
+  LoadFieldInstr* context_load = new LoadFieldInstr(
+      closure_val,
+      Closure::context_offset(),
+      AbstractType::ZoneHandle(I, AbstractType::null()),
+      node->token_pos());
   context_load->set_is_immutable(true);
   Value* context_val = Bind(context_load);
   AddInstruction(new StoreContextInstr(context_val));
   closure_val = Bind(new LoadLocalInstr(*tmp_var));
-  LoadFieldInstr* function_load =
-      new LoadFieldInstr(closure_val,
-                         Closure::function_offset(),
-                         AbstractType::ZoneHandle(),
-                         node->token_pos());
+  LoadFieldInstr* function_load = new LoadFieldInstr(
+      closure_val,
+      Closure::function_offset(),
+      AbstractType::ZoneHandle(I, AbstractType::null()),
+      node->token_pos());
   function_load->set_is_immutable(true);
   Value* function_val = Bind(function_load);
   Definition* closure_call =
@@ -2503,7 +2508,7 @@
 
 
 Value* EffectGraphVisitor::BuildObjectAllocation(ConstructorCallNode* node) {
-  const Class& cls = Class::ZoneHandle(node->constructor().Owner());
+  const Class& cls = Class::ZoneHandle(I, node->constructor().Owner());
   const bool cls_is_parameterized = cls.NumTypeArguments() > 0;
 
   ZoneGrowableArray<PushArgumentInstr*>* allocate_arguments =
@@ -2516,7 +2521,7 @@
 
   Definition* allocation = new AllocateObjectInstr(
       node->token_pos(),
-      Class::ZoneHandle(node->constructor().Owner()),
+      Class::ZoneHandle(I, node->constructor().Owner()),
       allocate_arguments);
 
   return Bind(allocation);
@@ -2527,7 +2532,7 @@
     ConstructorCallNode* node,
     PushArgumentInstr* push_alloc_value) {
   Value* ctor_arg = Bind(
-      new ConstantInstr(Smi::ZoneHandle(Smi::New(Function::kCtorPhaseAll))));
+      new ConstantInstr(Smi::ZoneHandle(I, Smi::New(Function::kCtorPhaseAll))));
   PushArgumentInstr* push_ctor_arg = PushArgument(ctor_arg);
 
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
@@ -2611,7 +2616,7 @@
 Value* EffectGraphVisitor::BuildInstantiator(const Class& instantiator_class) {
   ASSERT(instantiator_class.NumTypeParameters() > 0);
   Function& outer_function =
-      Function::Handle(owner()->parsed_function()->function().raw());
+      Function::Handle(I, owner()->parsed_function()->function().raw());
   while (outer_function.IsLocalFunction()) {
     outer_function = outer_function.parent_function();
   }
@@ -2634,9 +2639,11 @@
     Value* instantiator) {
   if (instantiator_class.NumTypeParameters() == 0) {
     // The type arguments are compile time constants.
-    TypeArguments& type_arguments = TypeArguments::ZoneHandle();
+    TypeArguments& type_arguments =
+        TypeArguments::ZoneHandle(I, TypeArguments::null());
     // Type is temporary. Only its type arguments are preserved.
     Type& type = Type::Handle(
+        I,
         Type::New(instantiator_class, type_arguments, token_pos, Heap::kNew));
     type ^= ClassFinalizer::FinalizeType(
         instantiator_class, type, ClassFinalizer::kFinalize);
@@ -2646,7 +2653,7 @@
     return Bind(new ConstantInstr(type_arguments));
   }
   Function& outer_function =
-      Function::Handle(owner()->parsed_function()->function().raw());
+      Function::Handle(I, owner()->parsed_function()->function().raw());
   while (outer_function.IsLocalFunction()) {
     outer_function = outer_function.parent_function();
   }
@@ -2672,7 +2679,7 @@
   return Bind(new LoadFieldInstr(
       instantiator,
       type_arguments_field_offset,
-      Type::ZoneHandle(),  // Not an instance, no type.
+      Type::ZoneHandle(I, Type::null()),  // Not an instance, no type.
       Scanner::kNoSourcePos));
 }
 
@@ -2685,7 +2692,7 @@
   }
   // The type arguments are uninstantiated.
   const Class& instantiator_class = Class::ZoneHandle(
-      owner()->parsed_function()->function().Owner());
+      I, owner()->parsed_function()->function().Owner());
   Value* instantiator_value =
       BuildInstantiatorTypeArguments(token_pos, instantiator_class, NULL);
   const bool use_instantiator_type_args =
@@ -2735,7 +2742,7 @@
       new ZoneGrowableArray<PushArgumentInstr*>(1);
   arguments->Add(push_receiver);
   const String& name =
-      String::ZoneHandle(Field::GetterSymbol(node->field_name()));
+      String::ZoneHandle(I, Field::GetterSymbol(node->field_name()));
   InstanceCallInstr* call = new InstanceCallInstr(
       node->token_pos(),
       name,
@@ -2775,7 +2782,7 @@
       new ZoneGrowableArray<PushArgumentInstr*>(2);
   BuildInstanceSetterArguments(node, arguments, kResultNotNeeded);
   const String& name =
-      String::ZoneHandle(Field::SetterSymbol(node->field_name()));
+      String::ZoneHandle(I, Field::SetterSymbol(node->field_name()));
   InstanceCallInstr* call = new InstanceCallInstr(node->token_pos(),
                                                   name,
                                                   Token::kSET,
@@ -2792,7 +2799,7 @@
       new ZoneGrowableArray<PushArgumentInstr*>(2);
   BuildInstanceSetterArguments(node, arguments, kResultNeeded);
   const String& name =
-      String::ZoneHandle(Field::SetterSymbol(node->field_name()));
+      String::ZoneHandle(I, Field::SetterSymbol(node->field_name()));
   Do(new InstanceCallInstr(node->token_pos(),
                            name,
                            Token::kSET,
@@ -2806,10 +2813,10 @@
 
 void EffectGraphVisitor::VisitStaticGetterNode(StaticGetterNode* node) {
   const String& getter_name =
-      String::ZoneHandle(Field::GetterSymbol(node->field_name()));
+      String::ZoneHandle(I, Field::GetterSymbol(node->field_name()));
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>();
-  Function& getter_function = Function::ZoneHandle();
+  Function& getter_function = Function::ZoneHandle(I, Function::null());
   if (node->is_super_getter()) {
     // Statically resolved instance getter, i.e. "super getter".
     ASSERT(node->receiver() != NULL);
@@ -2878,7 +2885,7 @@
 void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
                                            bool result_is_needed) {
   const String& setter_name =
-      String::ZoneHandle(Field::SetterSymbol(node->field_name()));
+      String::ZoneHandle(I, Field::SetterSymbol(node->field_name()));
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>(1);
   // A super setter is an instance setter whose setter function is
@@ -2886,7 +2893,7 @@
   // Unlike a static getter, a super getter has a receiver parameter.
   const bool is_super_setter = (node->receiver() != NULL);
   Function& setter_function =
-      Function::ZoneHandle(is_super_setter
+      Function::ZoneHandle(I, is_super_setter
           ? Resolver::ResolveDynamicAnyArgs(node->cls(), setter_name)
           : node->cls().LookupStaticFunction(setter_name));
   StaticCallInstr* call;
@@ -3020,7 +3027,7 @@
         LoadFieldInstr* load = new LoadFieldInstr(
             receiver,
             String::length_offset(),
-            Type::ZoneHandle(Type::SmiType()),
+            Type::ZoneHandle(I, Type::SmiType()),
             node->token_pos());
         load->set_result_cid(kSmiCid);
         load->set_recognized_kind(MethodRecognizer::kStringBaseLength);
@@ -3028,7 +3035,8 @@
           return ReturnDefinition(load);
         }
         ASSERT(kind == MethodRecognizer::kStringBaseIsEmpty);
-        Value* zero_val = Bind(new ConstantInstr(Smi::ZoneHandle(Smi::New(0))));
+        Value* zero_val = Bind(new ConstantInstr(
+            Smi::ZoneHandle(I, Smi::New(0))));
         Value* load_val = Bind(load);
         StrictCompareInstr* compare =
             new StrictCompareInstr(node->token_pos(),
@@ -3046,7 +3054,7 @@
         LoadFieldInstr* load = new LoadFieldInstr(
             receiver,
             OffsetForLengthGetter(kind),
-            Type::ZoneHandle(Type::SmiType()),
+            Type::ZoneHandle(I, Type::SmiType()),
             node->token_pos());
         load->set_is_immutable(kind != MethodRecognizer::kGrowableArrayLength);
         load->set_result_cid(kSmiCid);
@@ -3064,14 +3072,14 @@
         LoadFieldInstr* data_load = new LoadFieldInstr(
             receiver,
             Array::data_offset(),
-            Type::ZoneHandle(Type::DynamicType()),
+            Type::ZoneHandle(I, Type::DynamicType()),
             node->token_pos());
         data_load->set_result_cid(kArrayCid);
         Value* data = Bind(data_load);
         LoadFieldInstr* length_load = new LoadFieldInstr(
             data,
             Array::length_offset(),
-            Type::ZoneHandle(Type::SmiType()),
+            Type::ZoneHandle(I, Type::SmiType()),
             node->token_pos());
         length_load->set_result_cid(kSmiCid);
         length_load->set_recognized_kind(MethodRecognizer::kObjectArrayLength);
@@ -3142,7 +3150,7 @@
   LoadFieldInstr* load = new LoadFieldInstr(
       for_instance.value(),
       &node->field(),
-      AbstractType::ZoneHandle(node->field().type()),
+      AbstractType::ZoneHandle(I, node->field().type()),
       node->token_pos());
   if (node->field().guarded_cid() != kIllegalCid) {
     if (!node->field().is_nullable() ||
@@ -3165,8 +3173,9 @@
   Append(for_value);
   Value* store_value = for_value.value();
   if (FLAG_enable_type_checks) {
-    const AbstractType& type = AbstractType::ZoneHandle(node->field().type());
-    const String& dst_name = String::ZoneHandle(node->field().name());
+    const AbstractType& type =
+        AbstractType::ZoneHandle(I, node->field().type());
+    const String& dst_name = String::ZoneHandle(I, node->field().name());
     store_value = BuildAssignableValue(node->value()->token_pos(),
                                        store_value,
                                        type,
@@ -3175,9 +3184,7 @@
 
   store_value = Bind(BuildStoreExprTemp(store_value));
   GuardFieldInstr* guard =
-      new GuardFieldInstr(store_value,
-                          node->field(),
-                          Isolate::Current()->GetNextDeoptId());
+      new GuardFieldInstr(store_value, node->field(), I->GetNextDeoptId());
   AddInstruction(guard);
 
   store_value = Bind(BuildLoadExprTemp());
@@ -3197,7 +3204,7 @@
     ASSERT(node->field().value() != Object::sentinel().raw());
     ASSERT(node->field().value() != Object::transition_sentinel().raw());
     Definition* result =
-        new ConstantInstr(Instance::ZoneHandle(node->field().value()));
+        new ConstantInstr(Instance::ZoneHandle(I, node->field().value()));
     return ReturnDefinition(result);
   }
   Value* field_value = Bind(new ConstantInstr(node->field()));
@@ -3217,14 +3224,6 @@
   } else {
     store_value = for_value.value();
   }
-  if (FLAG_enable_type_checks) {
-    const AbstractType& type = AbstractType::ZoneHandle(node->field().type());
-    const String& dst_name = String::ZoneHandle(node->field().name());
-    store_value = BuildAssignableValue(node->value()->token_pos(),
-                                       store_value,
-                                       type,
-                                       dst_name);
-  }
   StoreStaticFieldInstr* store =
       new StoreStaticFieldInstr(node->field(), store_value);
 
@@ -3252,8 +3251,8 @@
   if (node->IsSuperLoad()) {
     // Resolve the load indexed operator in the super class.
     super_function = &Function::ZoneHandle(
-          Resolver::ResolveDynamicAnyArgs(node->super_class(),
-                                          Symbols::IndexToken()));
+          I, Resolver::ResolveDynamicAnyArgs(node->super_class(),
+                                             Symbols::IndexToken()));
     if (super_function->IsNull()) {
       // Could not resolve super operator. Generate call noSuchMethod() of the
       // super class instead.
@@ -3313,8 +3312,8 @@
   if (node->IsSuperStore()) {
     // Resolve the store indexed operator in the super class.
     super_function = &Function::ZoneHandle(
-        Resolver::ResolveDynamicAnyArgs(node->super_class(),
-                                        Symbols::AssignIndexToken()));
+        I, Resolver::ResolveDynamicAnyArgs(node->super_class(),
+                                           Symbols::AssignIndexToken()));
     if (super_function->IsNull()) {
       // Could not resolve super operator. Generate call noSuchMethod() of the
       // super class instead.
@@ -3381,7 +3380,7 @@
     // Generate dynamic call to operator []=.
     const intptr_t checked_argument_count = 3;
     const String& name =
-        String::ZoneHandle(Symbols::New(Token::Str(Token::kASSIGN_INDEX)));
+        String::ZoneHandle(I, Symbols::New(Token::Str(Token::kASSIGN_INDEX)));
     InstanceCallInstr* store =
         new InstanceCallInstr(node->token_pos(),
                               name,
@@ -3423,7 +3422,8 @@
       context = Bind(
           new LoadFieldInstr(context,
                              Context::parent_offset(),
-                             Type::ZoneHandle(),  // Not an instance, no type.
+                             // Not an instance, no type.
+                             Type::ZoneHandle(I, Type::null()),
                              Scanner::kNoSourcePos));
     }
     AddInstruction(new StoreContextInstr(context));
@@ -3462,7 +3462,8 @@
       if (MustSaveRestoreContext(node)) {
         BuildSaveContext(
             *owner()->parsed_function()->saved_entry_context_var());
-        parent_context = Bind(new ConstantInstr(Object::ZoneHandle()));
+        parent_context = Bind(
+            new ConstantInstr(Object::ZoneHandle(I, Object::null())));
       } else {
         parent_context = Bind(new CurrentContextInstr());
       }
@@ -3492,7 +3493,7 @@
           LocalVariable* temp_local = new LocalVariable(
               0,  // Token index.
               temp_name,
-              Type::ZoneHandle(Type::DynamicType()));  // Type.
+              Type::ZoneHandle(I, Type::DynamicType()));  // Type.
           temp_local->set_index(param_frame_index);
 
           // Copy parameter from local frame to current context.
@@ -3501,8 +3502,8 @@
           // Write NULL to the source location to detect buggy accesses and
           // allow GC of passed value if it gets overwritten by a new value in
           // the function.
-          Value* null_constant =
-              Bind(new ConstantInstr(Object::ZoneHandle()));
+          Value* null_constant = Bind(new ConstantInstr(
+              Object::ZoneHandle(I, Object::null())));
           Do(BuildStoreLocal(*temp_local, null_constant));
         }
       }
@@ -3516,7 +3517,7 @@
         *owner()->parsed_function()->saved_entry_context_var());
     AddInstruction(
         new StoreContextInstr(Bind(new ConstantInstr(Object::ZoneHandle(
-            Isolate::Current()->object_store()->empty_context())))));
+            I, I->object_store()->empty_context())))));
   }
 
   // This check may be deleted if the generated code is leaf.
@@ -3707,8 +3708,8 @@
     }
     ASSERT(!for_finally.is_open());
 
-    const Array& types = Array::ZoneHandle(Array::New(1, Heap::kOld));
-    types.SetAt(0, Type::Handle(Type::DynamicType()));
+    const Array& types = Array::ZoneHandle(I, Array::New(1, Heap::kOld));
+    types.SetAt(0, Type::Handle(I, Type::DynamicType()));
     CatchBlockEntryInstr* finally_entry =
         new CatchBlockEntryInstr(owner()->AllocateBlockId(),
                                  original_handler_index,
@@ -3751,6 +3752,7 @@
                                          temp,
                                          is_super_invocation);
   const Function& no_such_method_func = Function::ZoneHandle(
+      I,
       Resolver::ResolveDynamicAnyArgs(target_class, Symbols::NoSuchMethod()));
   // We are guaranteed to find noSuchMethod of class Object.
   ASSERT(!no_such_method_func.IsNull());
@@ -3773,12 +3775,11 @@
     int invocation_type) {
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new ZoneGrowableArray<PushArgumentInstr*>();
-  // Object receiver.
-  // TODO(regis): For now, we pass a class literal of the unresolved
-  // method's owner, but this is not specified and will probably change.
+  // Object receiver, actually a class literal of the unresolved method's owner.
   Type& type = Type::ZoneHandle(
+      I,
       Type::New(function_class,
-                TypeArguments::Handle(),
+                TypeArguments::Handle(I, TypeArguments::null()),
                 token_pos,
                 Heap::kOld));
   type ^= ClassFinalizer::FinalizeType(
@@ -3786,21 +3787,23 @@
   Value* receiver_value = Bind(new ConstantInstr(type));
   arguments->Add(PushArgument(receiver_value));
   // String memberName.
-  const String& member_name = String::ZoneHandle(Symbols::New(function_name));
+  const String& member_name =
+      String::ZoneHandle(I, Symbols::New(function_name));
   Value* member_name_value = Bind(new ConstantInstr(member_name));
   arguments->Add(PushArgument(member_name_value));
   // Smi invocation_type.
   Value* invocation_type_value = Bind(new ConstantInstr(
-      Smi::ZoneHandle(Smi::New(invocation_type))));
+      Smi::ZoneHandle(I, Smi::New(invocation_type))));
   arguments->Add(PushArgument(invocation_type_value));
   // List arguments.
   if (function_arguments == NULL) {
-    Value* arguments_value = Bind(new ConstantInstr(Array::ZoneHandle()));
+    Value* arguments_value = Bind(
+        new ConstantInstr(Array::ZoneHandle(I, Array::null())));
     arguments->Add(PushArgument(arguments_value));
   } else {
     ValueGraphVisitor array_val(owner());
     ArrayNode* array =
-        new ArrayNode(token_pos, Type::ZoneHandle(Type::ArrayType()),
+        new ArrayNode(token_pos, Type::ZoneHandle(I, Type::ArrayType()),
                       function_arguments->nodes());
     array->Visit(&array_val);
     Append(array_val);
@@ -3808,21 +3811,22 @@
   }
   // List argumentNames.
   ConstantInstr* cinstr = new ConstantInstr(
-      (function_arguments == NULL) ? Array::ZoneHandle()
+      (function_arguments == NULL) ? Array::ZoneHandle(I, Array::null())
                                    : function_arguments->names());
   Value* argument_names_value = Bind(cinstr);
   arguments->Add(PushArgument(argument_names_value));
 
   // List existingArgumentNames.
   Value* existing_argument_names_value =
-      Bind(new ConstantInstr(Array::ZoneHandle()));
+      Bind(new ConstantInstr(Array::ZoneHandle(I, Array::null())));
   arguments->Add(PushArgument(existing_argument_names_value));
   // Resolve and call NoSuchMethodError._throwNew.
-  const Library& core_lib = Library::Handle(Library::CoreLibrary());
+  const Library& core_lib = Library::Handle(I, Library::CoreLibrary());
   const Class& cls = Class::Handle(
-      core_lib.LookupClass(Symbols::NoSuchMethodError()));
+      I, core_lib.LookupClass(Symbols::NoSuchMethodError()));
   ASSERT(!cls.IsNull());
   const Function& func = Function::ZoneHandle(
+      I,
       Resolver::ResolveStatic(cls,
                               Library::PrivateCoreLibName(Symbols::ThrowNew()),
                               arguments->length(),
@@ -3866,7 +3870,8 @@
 // so that the fragment is not closed in the middle of an expression.
 void ValueGraphVisitor::VisitThrowNode(ThrowNode* node) {
   BuildThrowNode(node);
-  ReturnDefinition(new ConstantInstr(Instance::ZoneHandle()));
+  ReturnDefinition(new ConstantInstr(
+      Instance::ZoneHandle(I, Instance::null())));
 }
 
 
@@ -3953,13 +3958,15 @@
   va_list args;
   va_start(args, format);
   const Error& error = Error::Handle(
-      LanguageError::NewFormattedV(Error::Handle(),  // No previous error.
-                                   Script::Handle(function.script()),
-                                   token_pos, LanguageError::kWarning,
-                                   Heap::kNew, format, args));
+      I,
+      LanguageError::NewFormattedV(
+          Error::Handle(I, Error::null()),  // No previous error.
+          Script::Handle(I, function.script()),
+          token_pos, LanguageError::kWarning,
+          Heap::kNew, format, args));
   va_end(args);
   if (FLAG_warning_as_error) {
-    Isolate::Current()->long_jump_base()->Jump(1, error);
+    I->long_jump_base()->Jump(1, error);
     UNREACHABLE();
   } else {
     OS::Print("%s", error.ToErrorCString());
@@ -3970,15 +3977,17 @@
 void FlowGraphBuilder::Bailout(const char* reason) const {
   const Function& function = parsed_function_->function();
   const Error& error = Error::Handle(
-      LanguageError::NewFormatted(Error::Handle(),  // No previous error.
-                                  Script::Handle(function.script()),
-                                  function.token_pos(),
-                                  LanguageError::kBailout,
-                                  Heap::kNew,
-                                  "FlowGraphBuilder Bailout: %s %s",
-                                  String::Handle(function.name()).ToCString(),
-                                  reason));
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+      I,
+      LanguageError::NewFormatted(
+          Error::Handle(I, Error::null()),  // No previous error.
+          Script::Handle(I, function.script()),
+          function.token_pos(),
+          LanguageError::kBailout,
+          Heap::kNew,
+          "FlowGraphBuilder Bailout: %s %s",
+          String::Handle(I, function.name()).ToCString(),
+          reason));
+  I->long_jump_base()->Jump(1, error);
   UNREACHABLE();
 }
 
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 938a30a..7632971 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -218,6 +218,8 @@
   // Returns address where the constant 'value' is stored or 0 if not found.
   static uword FindDoubleConstant(double value);
 
+  Isolate* isolate() const { return parsed_function()->isolate(); }
+
  private:
   friend class NestedStatement;  // Explicit access to nesting_stack_.
 
@@ -449,6 +451,8 @@
 
   void BuildLetTempExpressions(LetNode* node);
 
+  Isolate* isolate() const { return owner()->isolate(); }
+
  private:
   friend class TempLocalScope;  // For ReturnDefinition.
 
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index a1762f3..063415f 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -38,15 +38,8 @@
 DECLARE_FLAG(int, deoptimize_every);
 DECLARE_FLAG(charp, deoptimize_filter);
 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
-
-// TODO(zra): remove once arm64 has simd.
-#if defined(TARGET_ARCH_ARM64)
-DEFINE_FLAG(bool, enable_simd_inline, false,
-    "Enable inlining of SIMD related method calls.");
-#else
 DEFINE_FLAG(bool, enable_simd_inline, true,
     "Enable inlining of SIMD related method calls.");
-#endif
 DEFINE_FLAG(bool, source_lines, false, "Emit source line as assembly comment.");
 
 // Assign locations to incoming arguments, i.e., values pushed above spill slots
@@ -824,7 +817,7 @@
     if (ic_data.IsClosureCall()) {
       // This IC call may be closure call only.
       label_address = StubCode::ClosureCallInlineCacheEntryPoint();
-      ExternalLabel target_label("InlineCache", label_address);
+      ExternalLabel target_label(label_address);
       EmitInstanceCall(&target_label,
                        ICData::ZoneHandle(ic_data.AsUnaryClassChecks()),
                        argument_count, deopt_id, token_pos, locs);
@@ -849,7 +842,7 @@
       default:
         UNIMPLEMENTED();
     }
-    ExternalLabel target_label("InlineCache", label_address);
+    ExternalLabel target_label(label_address);
     EmitOptimizedInstanceCall(&target_label, ic_data,
                               argument_count, deopt_id, token_pos, locs);
     return;
@@ -879,7 +872,7 @@
     default:
       UNIMPLEMENTED();
   }
-  ExternalLabel target_label("InlineCache", label_address);
+  ExternalLabel target_label(label_address);
   EmitInstanceCall(&target_label, ic_data, argument_count,
                    deopt_id, token_pos, locs);
 }
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 01f5859..7e46f82 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -28,7 +28,6 @@
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(int, reoptimization_counter_threshold);
 DECLARE_FLAG(bool, enable_type_checks);
-DECLARE_FLAG(bool, eliminate_type_checks);
 DECLARE_FLAG(bool, enable_simd_inline);
 
 
@@ -47,7 +46,7 @@
 
 
 bool FlowGraphCompiler::SupportsUnboxedMints() {
-  return TargetCPUFeatures::neon_supported() && FLAG_unbox_mints;
+  return FLAG_unbox_mints;
 }
 
 
@@ -154,9 +153,7 @@
     builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i), slot_ix++);
   }
 
-  const DeoptInfo& deopt_info =
-      DeoptInfo::Handle(builder->CreateDeoptInfo(deopt_table));
-  return deopt_info.raw();
+  return builder->CreateDeoptInfo(deopt_table);
 }
 
 
@@ -253,7 +250,7 @@
   const bool smi_is_ok = int_type.IsSubtypeOf(type, &malformed_error);
   // Malformed type should have been handled at graph construction time.
   ASSERT(smi_is_ok || malformed_error.IsNull());
-  __ tst(kInstanceReg, ShifterOperand(kSmiTagMask));
+  __ tst(kInstanceReg, Operand(kSmiTagMask));
   if (smi_is_ok) {
     __ b(is_instance_lbl, EQ);
   } else {
@@ -339,7 +336,7 @@
   ASSERT(type_class.NumTypeArguments() == 0);
 
   const Register kInstanceReg = R0;
-  __ tst(kInstanceReg, ShifterOperand(kSmiTagMask));
+  __ tst(kInstanceReg, Operand(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(Smi::Class());
   if (smi_class.IsSubtypeOf(TypeArguments::Handle(),
@@ -449,7 +446,7 @@
 
     // For Smi check quickly against int and num interfaces.
     Label not_smi;
-    __ tst(R0, ShifterOperand(kSmiTagMask));  // Value is Smi?
+    __ tst(R0, Operand(kSmiTagMask));  // Value is Smi?
     __ b(&not_smi, NE);
     __ CompareObject(R2, Type::ZoneHandle(Type::IntType()));
     __ b(is_instance_lbl, EQ);
@@ -479,7 +476,7 @@
   if (type.IsType()) {
     const Register kInstanceReg = R0;
     const Register kTypeArgumentsReg = R1;
-    __ tst(kInstanceReg, ShifterOperand(kSmiTagMask));  // Is instance Smi?
+    __ tst(kInstanceReg, Operand(kSmiTagMask));  // Is instance Smi?
     __ b(is_not_instance_lbl, EQ);
     __ ldr(kTypeArgumentsReg, Address(SP, 0));  // Instantiator type args.
     // Uninstantiated type class is known at compile time, but the type
@@ -610,7 +607,7 @@
     if (negate_result) {
       __ Pop(R1);
       __ LoadObject(R0, Bool::True());
-      __ cmp(R1, ShifterOperand(R0));
+      __ cmp(R1, Operand(R0));
       __ b(&done, NE);
       __ LoadObject(R0, Bool::False());
     } else {
@@ -660,13 +657,6 @@
   __ CompareImmediate(R0, reinterpret_cast<int32_t>(Object::null()));
   __ b(&is_assignable, EQ);
 
-  if (!FLAG_eliminate_type_checks || dst_type.IsMalformed()) {
-    // If type checks are not eliminated during the graph building then
-    // a transition sentinel can be seen here.
-    __ CompareObject(R0, Object::transition_sentinel());
-    __ b(&is_assignable, EQ);
-  }
-
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
     __ PushObject(Object::ZoneHandle());  // Make room for the result.
@@ -762,14 +752,14 @@
   // Since R7 and R8 are Smi, use LSL 1 instead of LSL 2.
   // Let R7 point to the last passed positional argument, i.e. to
   // fp[kParamEndSlotFromFp + num_args - (num_pos_args - 1)].
-  __ sub(R7, R7, ShifterOperand(R8));
-  __ add(R7, FP, ShifterOperand(R7, LSL, 1));
-  __ add(R7, R7, ShifterOperand((kParamEndSlotFromFp + 1) * kWordSize));
+  __ sub(R7, R7, Operand(R8));
+  __ add(R7, FP, Operand(R7, LSL, 1));
+  __ add(R7, R7, Operand((kParamEndSlotFromFp + 1) * kWordSize));
 
   // Let R6 point to the last copied positional argument, i.e. to
   // fp[kFirstLocalSlotFromFp - (num_pos_args - 1)].
   __ AddImmediate(R6, FP, (kFirstLocalSlotFromFp + 1) * kWordSize);
-  __ sub(R6, R6, ShifterOperand(R8, LSL, 1));  // R8 is a Smi.
+  __ sub(R6, R6, Operand(R8, LSL, 1));  // R8 is a Smi.
   __ SmiUntag(R8);
   Label loop, loop_condition;
   __ b(&loop_condition);
@@ -782,7 +772,7 @@
   __ ldr(IP, argument_addr);
   __ str(IP, copy_addr);
   __ Bind(&loop_condition);
-  __ subs(R8, R8, ShifterOperand(1));
+  __ subs(R8, R8, Operand(1));
   __ b(&loop, PL);
 
   // Copy or initialize optional named arguments.
@@ -818,10 +808,10 @@
     __ SmiUntag(R8);
     // Let R7 point to the first passed argument, i.e. to
     // fp[kParamEndSlotFromFp + num_args - 0]; num_args (R7) is Smi.
-    __ add(R7, FP, ShifterOperand(R7, LSL, 1));
+    __ add(R7, FP, Operand(R7, LSL, 1));
     __ AddImmediate(R7, R7, kParamEndSlotFromFp * kWordSize);
     // Let R6 point to the entry of the first named argument.
-    __ add(R6, R4, ShifterOperand(
+    __ add(R6, R4, Operand(
         ArgumentsDescriptor::first_named_entry_offset() - kHeapObjectTag));
     for (int i = 0; i < num_opt_named_params; i++) {
       Label load_default_value, assign_optional_parameter;
@@ -837,8 +827,8 @@
       __ ldr(R5, Address(R6, ArgumentsDescriptor::position_offset()));
       // R5 is arg_pos as Smi.
       // Point to next named entry.
-      __ add(R6, R6, ShifterOperand(ArgumentsDescriptor::named_entry_size()));
-      __ rsb(R5, R5, ShifterOperand(0));
+      __ add(R6, R6, Operand(ArgumentsDescriptor::named_entry_size()));
+      __ rsb(R5, R5, Operand(0));
       Address argument_addr(R7, R5, LSL, 1);  // R5 is a negative Smi.
       __ ldr(R5, argument_addr);
       __ b(&assign_optional_parameter);
@@ -896,7 +886,7 @@
       __ ldr(R7, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
       __ SmiUntag(R7);
       // Check that R8 equals R7, i.e. no named arguments passed.
-      __ cmp(R8, ShifterOperand(R7));
+      __ cmp(R8, Operand(R7));
       __ b(&all_arguments_processed, EQ);
     }
   }
@@ -927,7 +917,7 @@
   // R4 : arguments descriptor array.
   __ ldr(R8, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
   __ SmiUntag(R8);
-  __ add(R7, FP, ShifterOperand((kParamEndSlotFromFp + 1) * kWordSize));
+  __ add(R7, FP, Operand((kParamEndSlotFromFp + 1) * kWordSize));
   const Address original_argument_addr(R7, R8, LSL, 2);
   __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null()));
   Label null_args_loop, null_args_loop_condition;
@@ -935,7 +925,7 @@
   __ Bind(&null_args_loop);
   __ str(IP, original_argument_addr);
   __ Bind(&null_args_loop_condition);
-  __ subs(R8, R8, ShifterOperand(1));
+  __ subs(R8, R8, Operand(1));
   __ b(&null_args_loop, PL);
 }
 
@@ -974,13 +964,13 @@
 
     // The pool pointer is not setup before entering the Dart frame.
     // Preserve PP of caller.
-    __ mov(R7, ShifterOperand(PP));
+    __ mov(R7, Operand(PP));
     // Temporarily setup pool pointer for this dart function.
     __ LoadPoolPointer();
     // Load function object from object pool.
     __ LoadObject(function_reg, function);  // Uses PP.
     // Restore PP of caller.
-    __ mov(PP, ShifterOperand(R7));
+    __ mov(PP, Operand(R7));
 
     // Patch point is after the eventually inlined function object.
     AddCurrentDescriptor(PcDescriptors::kEntryPatch,
@@ -994,7 +984,7 @@
       // IC stubs, but not at the entry of the function.
       threshold = FLAG_reoptimization_counter_threshold;
     } else {
-      __ add(R7, R7, ShifterOperand(1));
+      __ add(R7, R7, Operand(1));
       __ str(R7, FieldAddress(function_reg,
                               Function::usage_counter_offset()));
     }
@@ -1061,7 +1051,7 @@
       __ b(&wrong_num_arguments, NE);
       __ ldr(R1, FieldAddress(R4,
                               ArgumentsDescriptor::positional_count_offset()));
-      __ cmp(R0, ShifterOperand(R1));
+      __ cmp(R0, Operand(R1));
       __ b(&correct_num_arguments, EQ);
       __ Bind(&wrong_num_arguments);
       if (function.IsClosureFunction()) {
@@ -1185,7 +1175,7 @@
   __ Comment("Edge counter");
   __ LoadObject(R0, counter);
   __ ldr(IP, FieldAddress(R0, Array::element_offset(0)));
-  __ add(IP, IP, ShifterOperand(Smi::RawValue(1)));
+  __ add(IP, IP, Operand(Smi::RawValue(1)));
   __ str(IP, FieldAddress(R0, Array::element_offset(0)));
 }
 
@@ -1248,9 +1238,9 @@
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
   Label not_smi, load_cache;
   __ LoadFromOffset(kWord, R0, SP, (argument_count - 1) * kWordSize);
-  __ tst(R0, ShifterOperand(kSmiTagMask));
+  __ tst(R0, Operand(kSmiTagMask));
   __ b(&not_smi, NE);
-  __ mov(R0, ShifterOperand(Smi::RawValue(kSmiCid)));
+  __ mov(R0, Operand(Smi::RawValue(kSmiCid)));
   __ b(&load_cache);
 
   __ Bind(&not_smi);
@@ -1264,24 +1254,24 @@
   __ ldr(R1, FieldAddress(R1, MegamorphicCache::mask_offset()));
   // R2: cache buckets array.
   // R1: mask.
-  __ mov(R3, ShifterOperand(R0));
+  __ mov(R3, Operand(R0));
 
   Label loop, update, call_target_function;
   __ b(&loop);
 
   __ Bind(&update);
-  __ add(R3, R3, ShifterOperand(Smi::RawValue(1)));
+  __ add(R3, R3, Operand(Smi::RawValue(1)));
   __ Bind(&loop);
-  __ and_(R3, R3, ShifterOperand(R1));
+  __ and_(R3, R3, Operand(R1));
   const intptr_t base = Array::data_offset();
   // R3 is smi tagged, but table entries are two words, so LSL 2.
-  __ add(IP, R2, ShifterOperand(R3, LSL, 2));
+  __ add(IP, R2, Operand(R3, LSL, 2));
   __ ldr(R4, FieldAddress(IP, base));
 
   ASSERT(kIllegalCid == 0);
-  __ tst(R4, ShifterOperand(R4));
+  __ tst(R4, Operand(R4));
   __ b(&call_target_function, EQ);
-  __ cmp(R4, ShifterOperand(R0));
+  __ cmp(R4, Operand(R0));
   __ b(&update, NE);
 
   __ Bind(&call_target_function);
@@ -1289,7 +1279,7 @@
   // proper target for the given name and arguments descriptor.  If the
   // illegal class id was found, the target is a cache miss handler that can
   // be invoked as a normal Dart function.
-  __ add(IP, R2, ShifterOperand(R3, LSL, 2));
+  __ add(IP, R2, Operand(R3, LSL, 2));
   __ ldr(R0, FieldAddress(IP, base + kWordSize));
   __ ldr(R1, FieldAddress(R0, Function::code_offset()));
   __ ldr(R1, FieldAddress(R1, Code::instructions_offset()));
@@ -1334,7 +1324,7 @@
   } else {
     UNIMPLEMENTED();
   }
-  ExternalLabel target_label("StaticCallICStub", label_address);
+  ExternalLabel target_label(label_address);
   __ LoadObject(R5, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1417,7 +1407,7 @@
     __ Pop(right);
     __ Pop(left);
   } else {
-    __ cmp(left, ShifterOperand(right));
+    __ cmp(left, Operand(right));
   }
 }
 
@@ -1551,7 +1541,7 @@
 
   if (source.IsRegister()) {
     if (destination.IsRegister()) {
-      __ mov(destination.reg(), ShifterOperand(source.reg()));
+      __ mov(destination.reg(), Operand(source.reg()));
     } else {
       ASSERT(destination.IsStackSlot());
       const intptr_t dest_offset = destination.ToStackSlotOffset();
@@ -1651,9 +1641,9 @@
   if (source.IsRegister() && destination.IsRegister()) {
     ASSERT(source.reg() != IP);
     ASSERT(destination.reg() != IP);
-    __ mov(IP, ShifterOperand(source.reg()));
-    __ mov(source.reg(), ShifterOperand(destination.reg()));
-    __ mov(destination.reg(), ShifterOperand(IP));
+    __ mov(IP, Operand(source.reg()));
+    __ mov(source.reg(), Operand(destination.reg()));
+    __ mov(destination.reg(), Operand(IP));
   } else if (source.IsRegister() && destination.IsStackSlot()) {
     Exchange(source.reg(), destination.ToStackSlotOffset());
   } else if (source.IsStackSlot() && destination.IsRegister()) {
@@ -1749,7 +1739,7 @@
 
 
 void ParallelMoveResolver::Exchange(Register reg, intptr_t stack_offset) {
-  __ mov(TMP, ShifterOperand(reg));
+  __ mov(TMP, Operand(reg));
   __ LoadFromOffset(kWord, reg, FP, stack_offset);
   __ StoreToOffset(kWord, TMP, FP, stack_offset);
 }
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index c445bb5..0bc1a5e 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -25,7 +25,6 @@
 DEFINE_FLAG(bool, trap_on_deoptimization, false, "Trap on deoptimization.");
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(int, reoptimization_counter_threshold);
-DECLARE_FLAG(bool, eliminate_type_checks);
 DECLARE_FLAG(bool, enable_simd_inline);
 
 
@@ -146,9 +145,7 @@
     builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i), slot_ix++);
   }
 
-  const DeoptInfo& deopt_info =
-      DeoptInfo::Handle(builder->CreateDeoptInfo(deopt_table));
-  return deopt_info.raw();
+  return builder->CreateDeoptInfo(deopt_table);
 }
 
 
@@ -655,13 +652,6 @@
   __ CompareObject(R0, Object::null_object(), PP);
   __ b(&is_assignable, EQ);
 
-  if (!FLAG_eliminate_type_checks || dst_type.IsMalformed()) {
-    // If type checks are not eliminated during the graph building then
-    // a transition sentinel can be seen here.
-    __ CompareObject(R0, Object::transition_sentinel(), PP);
-    __ b(&is_assignable, EQ);
-  }
-
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
     __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
@@ -1340,7 +1330,7 @@
   } else {
     UNIMPLEMENTED();
   }
-  ExternalLabel target_label("StaticCallICStub", label_address);
+  ExternalLabel target_label(label_address);
   __ LoadObject(R5, ic_data, PP);
   GenerateDartCall(deopt_id,
                    token_pos,
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index aa247a6..3394965 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -28,7 +28,6 @@
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(int, reoptimization_counter_threshold);
 DECLARE_FLAG(bool, enable_type_checks);
-DECLARE_FLAG(bool, eliminate_type_checks);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
 DECLARE_FLAG(bool, enable_simd_inline);
 
@@ -49,8 +48,7 @@
 
 
 bool FlowGraphCompiler::SupportsUnboxedMints() {
-  // Support unboxed mints when SSE 4.1 is available.
-  return FLAG_unbox_mints && TargetCPUFeatures::sse4_1_supported();
+  return FLAG_unbox_mints;
 }
 
 
@@ -152,9 +150,7 @@
     builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i), slot_ix++);
   }
 
-  const DeoptInfo& deopt_info =
-      DeoptInfo::Handle(builder->CreateDeoptInfo(deopt_table));
-  return deopt_info.raw();
+  return builder->CreateDeoptInfo(deopt_table);
 }
 
 
@@ -678,16 +674,6 @@
   __ cmpl(EAX, raw_null);
   __ j(EQUAL, &is_assignable);
 
-  if (!FLAG_eliminate_type_checks || dst_type.IsMalformed()) {
-    // If type checks are not eliminated during the graph building then
-    // a transition sentinel can be seen here.
-    const Immediate& raw_transition_sentinel =
-        Immediate(reinterpret_cast<intptr_t>(
-            Object::transition_sentinel().raw()));
-    __ cmpl(EAX, raw_transition_sentinel);
-    __ j(EQUAL, &is_assignable);
-  }
-
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
     __ PushObject(Object::ZoneHandle());  // Make room for the result.
@@ -1215,7 +1201,7 @@
   } else {
     UNIMPLEMENTED();
   }
-  ExternalLabel target_label("StaticCallICStub", label_address);
+  ExternalLabel target_label(label_address);
   __ LoadObject(ECX, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index a7e571c..319c7ad 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -25,7 +25,6 @@
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(int, reoptimization_counter_threshold);
 DECLARE_FLAG(bool, enable_type_checks);
-DECLARE_FLAG(bool, eliminate_type_checks);
 
 
 FlowGraphCompiler::~FlowGraphCompiler() {
@@ -150,9 +149,7 @@
     builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i), slot_ix++);
   }
 
-  const DeoptInfo& deopt_info =
-      DeoptInfo::Handle(builder->CreateDeoptInfo(deopt_table));
-  return deopt_info.raw();
+  return builder->CreateDeoptInfo(deopt_table);
 }
 
 
@@ -664,12 +661,6 @@
   __ BranchEqual(A0, reinterpret_cast<int32_t>(Object::null()), &is_assignable);
   __ delay_slot()->sw(A1, Address(SP, 0 * kWordSize));
 
-  if (!FLAG_eliminate_type_checks || dst_type.IsMalformed()) {
-    // If type checks are not eliminated during the graph building then
-    // a transition sentinel can be seen here.
-    __ BranchEqual(A0, Object::transition_sentinel(), &is_assignable);
-  }
-
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
     __ addiu(SP, SP, Immediate(-4 * kWordSize));
@@ -1375,7 +1366,7 @@
   } else {
     UNIMPLEMENTED();
   }
-  ExternalLabel target_label("StaticCallICStub", label_address);
+  ExternalLabel target_label(label_address);
   __ LoadObject(S5, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index d6175ce..06c1ebd 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -25,7 +25,6 @@
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(int, reoptimization_counter_threshold);
 DECLARE_FLAG(bool, enable_type_checks);
-DECLARE_FLAG(bool, eliminate_type_checks);
 DECLARE_FLAG(bool, enable_simd_inline);
 
 
@@ -148,9 +147,7 @@
     builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i), slot_ix++);
   }
 
-  const DeoptInfo& deopt_info =
-      DeoptInfo::Handle(builder->CreateDeoptInfo(deopt_table));
-  return deopt_info.raw();
+  return builder->CreateDeoptInfo(deopt_table);
 }
 
 
@@ -663,13 +660,6 @@
   __ CompareObject(RAX, Object::null_object(), PP);
   __ j(EQUAL, &is_assignable);
 
-  if (!FLAG_eliminate_type_checks || dst_type.IsMalformed()) {
-    // If type checks are not eliminated during the graph building then
-    // a transition sentinel can be seen here.
-    __ CompareObject(RAX, Object::transition_sentinel(), PP);
-    __ j(EQUAL, &is_assignable);
-  }
-
   // Generate throw new TypeError() if the type is malformed or malbounded.
   if (dst_type.IsMalformedOrMalbounded()) {
     __ PushObject(Object::ZoneHandle(), PP);  // Make room for the result.
@@ -1250,7 +1240,7 @@
   } else {
     UNIMPLEMENTED();
   }
-  ExternalLabel target_label("StaticCallICStub", label_address);
+  ExternalLabel target_label(label_address);
   __ LoadObject(RBX, ic_data, PP);
   GenerateDartCall(deopt_id,
                    token_pos,
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index fbc5327..b07c635 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -952,7 +952,8 @@
       }
     }
     *in_cache = false;
-    ParsedFunction* parsed_function = new(isolate()) ParsedFunction(function);
+    ParsedFunction* parsed_function =
+        new(isolate()) ParsedFunction(isolate(), function);
     Parser::ParseFunction(parsed_function);
     parsed_function->AllocateVariables();
     return parsed_function;
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index bd6fea2..2eb069e 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -44,7 +44,6 @@
 DEFINE_FLAG(bool, truncating_left_shift, true,
     "Optimize left shift to truncate if possible");
 DEFINE_FLAG(bool, use_cha, true, "Use class hierarchy analysis.");
-DECLARE_FLAG(bool, eliminate_type_checks);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, source_lines);
 DECLARE_FLAG(bool, trace_type_check_elimination);
@@ -5472,7 +5471,7 @@
     kConstantIndex = 4,
     kNumKinds = kConstantIndex + 1
   };
-  COMPILE_ASSERT(kNumKinds < ((1 << kBitsForKind) - 1), InvalidBitFieldSize);
+  COMPILE_ASSERT(kNumKinds < ((1 << kBitsForKind) - 1));
 
   explicit Alias(intptr_t alias) : alias_(alias) { }
 
@@ -7585,7 +7584,7 @@
   // strings.
   // Other effects like modifications of fields are tracked in a separate load
   // forwarding pass via Alias structure.
-  COMPILE_ASSERT(EffectSet::kLastEffect == 1, single_effect_is_tracked);
+  COMPILE_ASSERT(EffectSet::kLastEffect == 1);
 
   CSEInstructionMap() : independent_(), dependent_() { }
   explicit CSEInstructionMap(const CSEInstructionMap& other)
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 0442439..282972f 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -913,23 +913,25 @@
 
 
 CompileType LoadStaticFieldInstr::ComputeType() const {
-  if (FLAG_enable_type_checks) {
-    return CompileType::FromAbstractType(
-        AbstractType::ZoneHandle(StaticField().type()));
-  }
+  bool is_nullable = CompileType::kNullable;
+  intptr_t cid = kDynamicCid;
+  AbstractType* abstract_type = NULL;
   const Field& field = this->StaticField();
+  if (FLAG_enable_type_checks) {
+    cid = kIllegalCid;
+    abstract_type = &AbstractType::ZoneHandle(field.type());
+  }
   ASSERT(field.is_static());
   if (field.is_final()) {
-    Instance& obj = Instance::Handle(field.value());
+    const Instance& obj = Instance::Handle(field.value());
     if ((obj.raw() != Object::sentinel().raw()) &&
         (obj.raw() != Object::transition_sentinel().raw()) &&
         !obj.IsNull()) {
-      return CompileType(CompileType::kNonNullable,
-                         Class::Handle(obj.clazz()).id(),
-                         NULL);
+      is_nullable = CompileType::kNonNullable;
+      cid = obj.GetClassId();
     }
   }
-  return CompileType::Dynamic();
+  return CompileType(is_nullable, cid, abstract_type);
 }
 
 
@@ -974,25 +976,27 @@
     return CompileType::Dynamic();
   }
 
+  const AbstractType* abstract_type = NULL;
   if (FLAG_enable_type_checks) {
     ASSERT(!type().HasResolvedTypeClass() ||
            !Field::IsExternalizableCid(Class::Handle(
                 type().type_class()).id()));
-    return CompileType::FromAbstractType(type());
+    abstract_type = &type();
   }
 
   if ((field_ != NULL) && (field_->guarded_cid() != kIllegalCid)) {
+    bool is_nullable = field_->is_nullable();
     intptr_t field_cid =  field_->guarded_cid();
     if (Field::IsExternalizableCid(field_cid)) {
       // We cannot assume that the type of the value in the field has not
       // changed on the fly.
       field_cid = kDynamicCid;
     }
-    return CompileType::CreateNullable(field_->is_nullable(), field_cid);
+    return CompileType(is_nullable, field_cid, abstract_type);
   }
 
   ASSERT(!Field::IsExternalizableCid(result_cid_));
-  return CompileType::FromCid(result_cid_);
+  return CompileType::Create(result_cid_, *abstract_type);
 }
 
 
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index 7a02b87..4310a7c 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -21,7 +21,6 @@
 #undef OVERFLOW  // From math.h conflicts in constants_ia32.h
 
 namespace dart {
-
 // Smi value range is from -(2^N) to (2^N)-1.
 // N=30 (32-bit build) or N=62 (64-bit build).
 const intptr_t kSmiBits = kBitsPerWord - 2;
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index ebaec33..6d9995d 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -140,7 +140,7 @@
     offset = instr & 0xfff;
     start -= Instr::kInstrSize;
     instr = Instr::At(start)->InstructionBits();
-    if ((instr & 0xffff0000) == 0xe28a0000) {  // add reg, pp, shifter_op
+    if ((instr & 0xffff0000) == 0xe28a0000) {  // add reg, pp, operand
       const intptr_t rot = (instr & 0xf00) >> 7;
       const intptr_t imm8 = instr & 0xff;
       offset += (imm8 >> rot) | (imm8 << (32 - rot));
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 4ef69fa..fb04faa 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -1624,8 +1624,7 @@
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  const ExternalLabel label("debug_step_check",
-                            StubCode::DebugStepCheckEntryPoint());
+  const ExternalLabel label(StubCode::DebugStepCheckEntryPoint());
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
 }
 
@@ -2190,7 +2189,8 @@
 
 LocationSummary* PushTempInstr::MakeLocationSummary(Isolate* isolate,
                                                     bool optimizing) const {
-  return LocationSummary::Make(1,
+  return LocationSummary::Make(isolate,
+                               1,
                                Location::NoLocation(),
                                LocationSummary::kNoCall);
 }
@@ -2205,10 +2205,12 @@
 LocationSummary* DropTempsInstr::MakeLocationSummary(Isolate* isolate,
                                                      bool optimizing) const {
   return (InputCount() == 1)
-      ? LocationSummary::Make(1,
+      ? LocationSummary::Make(isolate,
+                              1,
                               Location::SameAsFirstInput(),
                               LocationSummary::kNoCall)
-      : LocationSummary::Make(0,
+      : LocationSummary::Make(isolate,
+                              0,
                               Location::NoLocation(),
                               LocationSummary::kNoCall);
 }
@@ -2349,12 +2351,12 @@
 Environment* Environment::From(Isolate* isolate,
                                const GrowableArray<Definition*>& definitions,
                                intptr_t fixed_parameter_count,
-                               const Code& code) {
+                               const ParsedFunction* parsed_function) {
   Environment* env =
       new(isolate) Environment(definitions.length(),
                                fixed_parameter_count,
                                Isolate::kNoDeoptId,
-                               code,
+                               parsed_function,
                                NULL);
   for (intptr_t i = 0; i < definitions.length(); ++i) {
     env->values_.Add(new(isolate) Value(definitions[i]));
@@ -2365,13 +2367,12 @@
 
 Environment* Environment::DeepCopy(Isolate* isolate, intptr_t length) const {
   ASSERT(length <= values_.length());
-  Environment* copy =
-      new(isolate) Environment(
-          length,
-          fixed_parameter_count_,
-          deopt_id_,
-          code_,
-          (outer_ == NULL) ? NULL : outer_->DeepCopy(isolate));
+  Environment* copy = new(isolate) Environment(
+      length,
+      fixed_parameter_count_,
+      deopt_id_,
+      parsed_function_,
+      (outer_ == NULL) ? NULL : outer_->DeepCopy(isolate));
   if (locations_ != NULL) {
     Location* new_locations = isolate->current_zone()->Alloc<Location>(length);
     copy->set_locations(new_locations);
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 7c329a6..bc2b3cf 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -11,6 +11,7 @@
 #include "vm/handles_impl.h"
 #include "vm/locations.h"
 #include "vm/object.h"
+#include "vm/parser.h"
 
 namespace dart {
 
@@ -365,7 +366,7 @@
   // Create a new CompileType representing given abstract type. By default
   // values as assumed to be nullable.
   static CompileType FromAbstractType(const AbstractType& type,
-                                       bool is_nullable = kNullable);
+                                      bool is_nullable = kNullable);
 
   // Create a new CompileType representing an value with the given class id.
   // Resulting CompileType is nullable only if cid is kDynamicCid or kNullCid.
@@ -1758,7 +1759,7 @@
   bool IsComparison() { return (AsComparison() != NULL); }
   virtual ComparisonInstr* AsComparison() { return NULL; }
 
-  // Overridden by definitions that push arguments.
+  // Overridden by definitions that have pushed arguments.
   virtual intptr_t ArgumentCount() const { return 0; }
 
   // Overridden by definitions that have call counts.
@@ -1931,6 +1932,34 @@
 }
 
 
+template<intptr_t N>
+class TemplateDefinition : public Definition {
+ public:
+  TemplateDefinition<N>() : inputs_() { }
+
+  virtual intptr_t InputCount() const { return N; }
+  virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
+
+ protected:
+  EmbeddedArray<Value*, N> inputs_;
+
+ private:
+  friend class BranchInstr;
+  friend class IfThenElseInstr;
+
+  virtual void RawSetInputAt(intptr_t i, Value* value) {
+    inputs_[i] = value;
+  }
+};
+
+
+struct BranchLabels {
+  Label* true_label;
+  Label* false_label;
+  Label* fall_through;
+};
+
+
 class PhiInstr : public Definition {
  public:
   PhiInstr(JoinEntryInstr* block, intptr_t num_inputs)
@@ -2066,7 +2095,7 @@
 };
 
 
-class PushArgumentInstr : public Definition {
+class PushArgumentInstr : public TemplateDefinition<1> {
  public:
   explicit PushArgumentInstr(Value* value) {
     SetInputAt(0, value);
@@ -2074,22 +2103,11 @@
 
   DECLARE_INSTRUCTION(PushArgument)
 
-  intptr_t InputCount() const { return 1; }
-  Value* InputAt(intptr_t i) const {
-    ASSERT(i == 0);
-    return value_;
-  }
-
   virtual intptr_t ArgumentCount() const { return 0; }
 
   virtual CompileType ComputeType() const;
 
-  Value* value() const { return value_; }
-
-  virtual intptr_t Hashcode() const {
-    UNREACHABLE();
-    return 0;
-  }
+  Value* value() const { return InputAt(0); }
 
   virtual bool CanDeoptimize() const { return false; }
 
@@ -2100,13 +2118,6 @@
   virtual bool MayThrow() const { return false; }
 
  private:
-  virtual void RawSetInputAt(intptr_t i, Value* value) {
-    ASSERT(i == 0);
-    value_ = value;
-  }
-
-  Value* value_;
-
   DISALLOW_COPY_AND_ASSIGN(PushArgumentInstr);
 };
 
@@ -2260,34 +2271,6 @@
 };
 
 
-template<intptr_t N>
-class TemplateDefinition : public Definition {
- public:
-  TemplateDefinition<N>() : inputs_() { }
-
-  virtual intptr_t InputCount() const { return N; }
-  virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
-
- protected:
-  EmbeddedArray<Value*, N> inputs_;
-
- private:
-  friend class BranchInstr;
-  friend class IfThenElseInstr;
-
-  virtual void RawSetInputAt(intptr_t i, Value* value) {
-    inputs_[i] = value;
-  }
-};
-
-
-struct BranchLabels {
-  Label* true_label;
-  Label* false_label;
-  Label* fall_through;
-};
-
-
 class ComparisonInstr : public TemplateDefinition<2> {
  public:
   Value* left() const { return inputs_[0]; }
@@ -7851,7 +7834,7 @@
   static Environment* From(Isolate* isolate,
                            const GrowableArray<Definition*>& definitions,
                            intptr_t fixed_parameter_count,
-                           const Code& code);
+                           const ParsedFunction* parsed_function);
 
   void set_locations(Location* locations) {
     ASSERT(locations_ == NULL);
@@ -7891,7 +7874,7 @@
     return fixed_parameter_count_;
   }
 
-  const Code& code() const { return code_; }
+  const Code& code() const { return parsed_function_->code(); }
 
   Environment* DeepCopy(Isolate* isolate) const {
     return DeepCopy(isolate, Length());
@@ -7914,13 +7897,13 @@
   Environment(intptr_t length,
               intptr_t fixed_parameter_count,
               intptr_t deopt_id,
-              const Code& code,
+              const ParsedFunction* parsed_function,
               Environment* outer)
       : values_(length),
         locations_(NULL),
         fixed_parameter_count_(fixed_parameter_count),
         deopt_id_(deopt_id),
-        code_(code),
+        parsed_function_(parsed_function),
         outer_(outer) { }
 
 
@@ -7928,7 +7911,7 @@
   Location* locations_;
   const intptr_t fixed_parameter_count_;
   intptr_t deopt_id_;
-  const Code& code_;
+  const ParsedFunction* parsed_function_;
   Environment* outer_;
 
   DISALLOW_COPY_AND_ASSIGN(Environment);
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 056a8e9..6312efa 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -91,7 +91,7 @@
   const intptr_t fp_sp_dist =
       (kFirstLocalSlotFromFp + 1 - compiler->StackSize()) * kWordSize;
   ASSERT(fp_sp_dist <= 0);
-  __ sub(R2, SP, ShifterOperand(FP));
+  __ sub(R2, SP, Operand(FP));
   __ CompareImmediate(R2, fp_sp_dist);
   __ b(&stack_ok, EQ);
   __ bkpt(0);
@@ -143,7 +143,7 @@
   ASSERT(!left.IsConstant() || !right.IsConstant());
 
   // Clear out register.
-  __ eor(result, result, ShifterOperand(result));
+  __ eor(result, result, Operand(result));
 
   // Emit comparison code. This must not overwrite the result register.
   BranchLabels labels = { NULL, NULL, NULL };
@@ -170,14 +170,14 @@
     }
   }
 
-  __ mov(result, ShifterOperand(1), true_condition);
+  __ mov(result, Operand(1), true_condition);
 
   if (is_power_of_two_kind) {
     const intptr_t shift =
         Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value));
     __ Lsl(result, result, shift + kSmiTagSize);
   } else {
-    __ sub(result, result, ShifterOperand(1));
+    __ sub(result, result, Operand(1));
     const int32_t val =
         Smi::RawValue(true_value) - Smi::RawValue(false_value);
     __ AndImmediate(result, result, val);
@@ -241,7 +241,8 @@
 
 LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
                                                      bool opt) const {
-  return LocationSummary::Make(0,
+  return LocationSummary::Make(isolate,
+                               0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -255,7 +256,8 @@
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
-  return LocationSummary::Make(1,
+  return LocationSummary::Make(isolate,
+                               1,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
@@ -271,7 +273,8 @@
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
                                                     bool opt) const {
-  return LocationSummary::Make(0,
+  return LocationSummary::Make(isolate,
+                               0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -437,9 +440,9 @@
                          Label* value_is_smi = NULL) {
   Label done;
   if (value_is_smi == NULL) {
-    __ mov(value_cid_reg, ShifterOperand(kSmiCid));
+    __ mov(value_cid_reg, Operand(kSmiCid));
   }
-  __ tst(value_reg, ShifterOperand(kSmiTagMask));
+  __ tst(value_reg, Operand(kSmiTagMask));
   if (value_is_smi == NULL) {
     __ b(&done, EQ);
   } else {
@@ -503,7 +506,7 @@
   } else if (right.IsConstant()) {
     __ CompareObject(left.reg(), right.constant());
   } else {
-    __ cmp(left.reg(), ShifterOperand(right.reg()));
+    __ cmp(left.reg(), Operand(right.reg()));
   }
   return true_condition;
 }
@@ -536,9 +539,9 @@
   Register right2 = right_pair->At(1).reg();
 
   // Compare lower.
-  __ cmp(left1, ShifterOperand(right1));
+  __ cmp(left1, Operand(right1));
   // Compare upper if lower is equal.
-  __ cmp(left2, ShifterOperand(right2), EQ);
+  __ cmp(left2, Operand(right2), EQ);
   return TokenKindToMintCondition(kind);
 }
 
@@ -577,13 +580,13 @@
 
   Label is_true, is_false, done;
   // Compare upper halves first.
-  __ cmp(left2, ShifterOperand(right2));
+  __ cmp(left2, Operand(right2));
   __ LoadImmediate(out, 0, hi_false_cond);
   __ LoadImmediate(out, 1, hi_true_cond);
   // If higher words aren't equal, skip comparing lower words.
   __ b(&done, NE);
 
-  __ cmp(left1, ShifterOperand(right1));
+  __ cmp(left1, Operand(right1));
   __ LoadImmediate(out, 1);
   __ LoadImmediate(out, 0, lo_false_cond);
   __ Bind(&done);
@@ -698,7 +701,7 @@
         reinterpret_cast<int32_t>(right.constant().raw());
     __ TestImmediate(left, imm);
   } else {
-    __ tst(left, ShifterOperand(right.reg()));
+    __ tst(left, Operand(right.reg()));
   }
   Condition true_condition = (kind() == Token::kNE) ? NE : EQ;
   return true_condition;
@@ -745,7 +748,7 @@
   const ZoneGrowableArray<intptr_t>& data = cid_results();
   ASSERT(data[0] == kSmiCid);
   bool result = data[1] == true_result;
-  __ tst(val_reg, ShifterOperand(kSmiTagMask));
+  __ tst(val_reg, Operand(kSmiTagMask));
   __ b(result ? labels.true_label : labels.false_label, EQ);
   __ LoadClassId(cid_reg, val_reg);
 
@@ -957,7 +960,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -976,7 +980,8 @@
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -987,7 +992,7 @@
   const Register str = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   __ ldr(result, FieldAddress(str, String::length_offset()));
-  __ cmp(result, ShifterOperand(Smi::RawValue(1)));
+  __ cmp(result, Operand(Smi::RawValue(1)));
   __ LoadImmediate(result, -1, NE);
   __ ldrb(result, FieldAddress(str, OneByteString::data_offset()), EQ);
   __ SmiTag(result);
@@ -1024,7 +1029,8 @@
 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -1040,7 +1046,8 @@
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -1050,7 +1057,7 @@
   const Register object = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   Label load, done;
-  __ tst(object, ShifterOperand(kSmiTagMask));
+  __ tst(object, Operand(kSmiTagMask));
   __ b(&load, NE);
   __ LoadImmediate(result, Smi::RawValue(kSmiCid));
   __ b(&done);
@@ -1233,9 +1240,9 @@
       (size == kSWord) || (size == kDWord) || (size == kRegList)) {
     if (shift < 0) {
       ASSERT(shift == -1);
-      assembler->add(base, array, ShifterOperand(index, ASR, 1));
+      assembler->add(base, array, Operand(index, ASR, 1));
     } else {
-      assembler->add(base, array, ShifterOperand(index, LSL, shift));
+      assembler->add(base, array, Operand(index, LSL, shift));
     }
   } else {
     if (shift < 0) {
@@ -1260,11 +1267,11 @@
 
 
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // The array register points to the backing store for external arrays.
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address(kNoRegister, 0);
-  element_address = index.IsRegister()
+  Address element_address = index.IsRegister()
       ? ElementAddressForRegIndex(compiler->assembler(),
                                   true,  // Load.
                                   IsExternal(), class_id(), index_scale(),
@@ -1317,7 +1324,7 @@
         // Load low word.
         __ ldr(result1, element_address);
         // Zero high word.
-        __ eor(result2, result2, ShifterOperand(result2));
+        __ eor(result2, result2, Operand(result2));
         break;
       default:
         UNREACHABLE();
@@ -1328,7 +1335,7 @@
 
   ASSERT(representation() == kTagged);
 
-  Register result = locs()->out(0).reg();
+  const Register result = locs()->out(0).reg();
   switch (class_id()) {
     case kTypedDataInt8ArrayCid:
       ASSERT(index_scale() == 1);
@@ -1444,14 +1451,13 @@
     case kOneByteStringCid:
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
-      locs->set_in(2, Location::WritableRegister());
+      locs->set_in(2, Location::RequiresRegister());
       break;
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // For smis, use a writable register because the value must be untagged
-      // before storing. Mints are stored in register pairs.
+      // Smis are untagged in TMP register. Mints are stored in register pairs.
       if (value()->IsSmiValue()) {
-        locs->set_in(2, Location::WritableRegister());
+        locs->set_in(2, Location::RequiresRegister());
       } else {
         // We only move the lower 32-bits so we don't care where the high bits
         // are located.
@@ -1478,17 +1484,17 @@
 
 
 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  // The array register points to the backing store for external arrays.
   const Register array = locs()->in(0).reg();
-  Location index = locs()->in(1);
+  const Location index = locs()->in(1);
 
-  Address element_address(kNoRegister, 0);
-  element_address = index.IsRegister()
-  ? ElementAddressForRegIndex(compiler->assembler(),
-                              false,  // Store.
-                              IsExternal(), class_id(), index_scale(),
-                              array, index.reg())
-  : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
-                              array, Smi::Cast(index.constant()).Value());
+  Address element_address = index.IsRegister()
+      ? ElementAddressForRegIndex(compiler->assembler(),
+                                  false,  // Store.
+                                  IsExternal(), class_id(), index_scale(),
+                                  array, index.reg())
+      : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
+                                  array, Smi::Cast(index.constant()).Value());
 
   switch (class_id()) {
     case kArrayCid:
@@ -1513,8 +1519,8 @@
         __ strb(IP, element_address);
       } else {
         const Register value = locs()->in(2).reg();
-        __ SmiUntag(value);
-        __ strb(value, element_address);
+        __ SmiUntag(IP, value);
+        __ strb(IP, element_address);
       }
       break;
     }
@@ -1533,23 +1539,21 @@
         __ strb(IP, element_address);
       } else {
         const Register value = locs()->in(2).reg();
-        Label store_value;
-        __ SmiUntag(value);
-        __ cmp(value, ShifterOperand(0xFF));
+        __ LoadImmediate(IP, 0x1FE);  // Smi 0xFF.
+        __ cmp(value, Operand(IP));  // Compare Smi value and smi 0xFF.
         // Clamp to 0x00 or 0xFF respectively.
-        __ b(&store_value, LS);
-        __ mov(value, ShifterOperand(0x00), LE);
-        __ mov(value, ShifterOperand(0xFF), GT);
-        __ Bind(&store_value);
-        __ strb(value, element_address);
+        __ mov(IP, Operand(0), LE);  // IP = value <= 0x1FE ? 0 : 0x1FE.
+        __ mov(IP, Operand(value), LS);  // IP = value in range ? value : IP.
+        __ SmiUntag(IP);
+        __ strb(IP, element_address);
       }
       break;
     }
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid: {
       const Register value = locs()->in(2).reg();
-      __ SmiUntag(value);
-      __ strh(value, element_address);
+      __ SmiUntag(IP, value);
+      __ strh(IP, element_address);
       break;
     }
     case kTypedDataInt32ArrayCid:
@@ -1557,8 +1561,8 @@
       if (value()->IsSmiValue()) {
         ASSERT(RequiredInputRepresentation(2) == kTagged);
         const Register value = locs()->in(2).reg();
-        __ SmiUntag(value);
-        __ str(value, element_address);
+        __ SmiUntag(IP, value);
+        __ str(IP, element_address);
       } else {
         ASSERT(RequiredInputRepresentation(2) == kUnboxedMint);
         PairLocation* value_pair = locs()->in(2).AsPairLocation();
@@ -1670,7 +1674,7 @@
       LoadValueCid(compiler, value_cid_reg, value_reg);
       Label skip_length_check;
       __ ldr(IP, field_cid_operand);
-      __ cmp(value_cid_reg, ShifterOperand(IP));
+      __ cmp(value_cid_reg, Operand(IP));
       __ b(&skip_length_check, NE);
       if (field_has_length) {
         ASSERT(temp_reg != kNoRegister);
@@ -1709,7 +1713,7 @@
           __ ldr(temp_reg,
                  FieldAddress(value_reg, TypedData::length_offset()));
           __ ldr(IP, field_length_operand);
-          __ cmp(temp_reg, ShifterOperand(IP));
+          __ cmp(temp_reg, Operand(IP));
           __ b(&length_compared);
           // Check for regular array.
           __ Bind(&check_array);
@@ -1720,7 +1724,7 @@
           __ ldr(temp_reg,
                  FieldAddress(value_reg, Array::length_offset()));
           __ ldr(IP, field_length_operand);
-          __ cmp(temp_reg, ShifterOperand(IP));
+          __ cmp(temp_reg, Operand(IP));
           __ b(&length_compared);
           __ Bind(&no_fixed_length);
           __ b(fail);
@@ -1731,7 +1735,7 @@
       }
       __ Bind(&skip_length_check);
       __ ldr(IP, field_nullability_operand);
-      __ cmp(value_cid_reg, ShifterOperand(IP));
+      __ cmp(value_cid_reg, Operand(IP));
     } else if (value_cid == kNullCid) {
       __ ldr(value_cid_reg, field_nullability_operand);
       __ CompareImmediate(value_cid_reg, value_cid);
@@ -1853,7 +1857,7 @@
     }
     if (value_cid == kDynamicCid) {
       // Field's guarded class id is fixed by value's class id is not known.
-      __ tst(value_reg, ShifterOperand(kSmiTagMask));
+      __ tst(value_reg, Operand(kSmiTagMask));
 
       if (field_cid != kSmiCid) {
         __ b(fail, EQ);
@@ -1878,7 +1882,7 @@
                  FieldAddress(value_reg, TypedData::length_offset()));
         }
         __ ldr(IP, field_length_operand);
-        __ cmp(value_cid_reg, ShifterOperand(IP));
+        __ cmp(value_cid_reg, Operand(IP));
       }
 
       if (field().is_nullable() && (field_cid != kNullCid)) {
@@ -1925,7 +1929,7 @@
 
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(cls_));
-    const ExternalLabel label(cls_.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2063,7 +2067,7 @@
     __ b(&store_pointer, EQ);
 
     __ ldrb(temp2, FieldAddress(temp, Field::kind_bits_offset()));
-    __ tst(temp2, ShifterOperand(1 << Field::kUnboxingCandidateBit));
+    __ tst(temp2, Operand(1 << Field::kUnboxingCandidateBit));
     __ b(&store_pointer, EQ);
 
     __ ldr(temp2, FieldAddress(temp, Field::guarded_cid_offset()));
@@ -2303,13 +2307,13 @@
   // R7: potential next object start.
   __ LoadImmediate(R3, heap->EndAddress());
   __ ldr(R3, Address(R3, 0));
-  __ cmp(R7, ShifterOperand(R3));
+  __ cmp(R7, Operand(R3));
   __ b(slow_path, CS);
 
   // Successfully allocated the object(s), now update top to point to
   // next object start and initialize the object.
   __ str(R7, Address(R6, 0));
-  __ add(R0, R0, ShifterOperand(kHeapObjectTag));
+  __ add(R0, R0, Operand(kHeapObjectTag));
   __ LoadImmediate(R8, heap->TopAddress());
   __ UpdateAllocationStatsWithSize(kArrayCid, R8, R4);
 
@@ -2347,7 +2351,7 @@
 
   Label init_loop;
   __ Bind(&init_loop);
-  __ cmp(R8, ShifterOperand(R7));
+  __ cmp(R8, Operand(R7));
   __ str(R3, Address(R8, 0), CC);
   __ AddImmediate(R8, kWordSize, CC);
   __ b(&init_loop, CC);
@@ -2404,7 +2408,7 @@
     const Class& double_class = compiler->double_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(double_class));
-    const ExternalLabel label(double_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2436,7 +2440,7 @@
     const Class& float32x4_class = compiler->float32x4_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class));
-    const ExternalLabel label(float32x4_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2446,7 +2450,7 @@
                            &label,
                            PcDescriptors::kOther,
                            locs);
-    __ mov(locs->out(0).reg(), ShifterOperand(R0));
+    __ mov(locs->out(0).reg(), Operand(R0));
     compiler->RestoreLiveRegisters(locs);
 
     __ b(exit_label());
@@ -2468,7 +2472,7 @@
     const Class& float64x2_class = compiler->float64x2_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class));
-    const ExternalLabel label(float64x2_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2478,7 +2482,7 @@
                            &label,
                            PcDescriptors::kOther,
                            locs);
-    __ mov(locs->out(0).reg(), ShifterOperand(R0));
+    __ mov(locs->out(0).reg(), Operand(R0));
     compiler->RestoreLiveRegisters(locs);
 
     __ b(exit_label());
@@ -2699,7 +2703,7 @@
   const intptr_t len = type_arguments().Length();
   if (type_arguments().IsRawInstantiatedRaw(len)) {
     __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null()));
-    __ cmp(instantiator_reg, ShifterOperand(IP));
+    __ cmp(instantiator_reg, Operand(IP));
     __ b(&type_arguments_instantiated, EQ);
   }
 
@@ -2711,7 +2715,7 @@
   Label loop, found, slow_case;
   __ Bind(&loop);
   __ ldr(R1, Address(R2, 0 * kWordSize));  // Cached instantiator.
-  __ cmp(R1, ShifterOperand(R0));
+  __ cmp(R1, Operand(R0));
   __ b(&found, EQ);
   __ AddImmediate(R2, 2 * kWordSize);
   __ CompareImmediate(R1, Smi::RawValue(StubCode::kNoInstantiator));
@@ -2755,8 +2759,7 @@
   ASSERT(locs()->out(0).reg() == R0);
 
   __ LoadImmediate(R1, num_context_variables());
-  const ExternalLabel label("alloc_context",
-                            StubCode::AllocateContextEntryPoint());
+  const ExternalLabel label(StubCode::AllocateContextEntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
                          PcDescriptors::kOther,
@@ -2900,7 +2903,7 @@
 
   __ LoadImmediate(IP, Isolate::Current()->stack_limit_address());
   __ ldr(IP, Address(IP));
-  __ cmp(SP, ShifterOperand(IP));
+  __ cmp(SP, Operand(IP));
   __ b(slow_path->entry_label(), LS);
   if (compiler->CanOSRFunction() && in_loop()) {
     const Register temp = locs()->temp(0).reg();
@@ -2942,7 +2945,7 @@
       // This condition may not be known earlier in some cases because
       // of constant propagation, inlining, etc.
       if ((value >= kCountLimit) && is_truncating) {
-        __ mov(result, ShifterOperand(0));
+        __ mov(result, Operand(0));
       } else {
         // Result is Mint or exception.
         __ b(deopt);
@@ -2951,7 +2954,7 @@
       if (!is_truncating) {
         // Check for overflow (preserve left).
         __ Lsl(IP, left, value);
-        __ cmp(left, ShifterOperand(IP, ASR, value));
+        __ cmp(left, Operand(IP, ASR, value));
         __ b(deopt, NE);  // Overflow.
       }
       // Shift for result now we know there is no overflow.
@@ -2970,9 +2973,9 @@
     if (obj.IsSmi()) {
       const intptr_t left_int = Smi::Cast(obj).Value();
       if (left_int == 0) {
-        __ cmp(right, ShifterOperand(0));
+        __ cmp(right, Operand(0));
         __ b(deopt, MI);
-        __ mov(result, ShifterOperand(0));
+        __ mov(result, Operand(0));
         return;
       }
       const intptr_t max_right = kSmiBits - Utils::HighestBit(left_int);
@@ -2980,11 +2983,10 @@
           (right_range == NULL) ||
           !right_range->IsWithin(0, max_right - 1);
       if (right_needs_check) {
-        __ cmp(right,
-               ShifterOperand(reinterpret_cast<int32_t>(Smi::New(max_right))));
+        __ cmp(right, Operand(reinterpret_cast<int32_t>(Smi::New(max_right))));
         __ b(deopt, CS);
       }
-      __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+      __ SmiUntag(IP, right);
       __ Lsl(result, left, IP);
     }
     return;
@@ -2999,33 +3001,31 @@
           !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
-        __ cmp(right, ShifterOperand(0));
+        __ cmp(right, Operand(0));
         __ b(deopt, MI);
       }
 
-      __ cmp(right,
-             ShifterOperand(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
-      __ mov(result, ShifterOperand(0), CS);
-      __ Asr(IP, right, kSmiTagSize, CC);  // SmiUntag right into IP if CC.
+      __ cmp(right, Operand(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
+      __ mov(result, Operand(0), CS);
+      __ SmiUntag(IP, right, CC);  // SmiUntag right into IP if CC.
       __ Lsl(result, left, IP, CC);
     } else {
-      __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+      __ SmiUntag(IP, right);
       __ Lsl(result, left, IP);
     }
   } else {
     if (right_needs_check) {
       ASSERT(shift_left->CanDeoptimize());
-      __ cmp(right,
-             ShifterOperand(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
+      __ cmp(right, Operand(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
       __ b(deopt, CS);
     }
     // Left is not a constant.
     // Check if count too large for handling it inlined.
-    __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+    __ SmiUntag(IP, right);
     // Overflow test (preserve left, right, and IP);
     const Register temp = locs.temp(0).reg();
     __ Lsl(temp, left, IP);
-    __ cmp(left, ShifterOperand(temp, ASR, IP));
+    __ cmp(left, Operand(temp, ASR, IP));
     __ b(deopt, NE);  // Overflow.
     // Shift for result now we know there is no overflow.
     __ Lsl(result, left, IP);
@@ -3123,24 +3123,24 @@
         const intptr_t value = Smi::Cast(constant).Value();
         if (deopt == NULL) {
           if (value == 2) {
-            __ mov(result, ShifterOperand(left, LSL, 1));
+            __ mov(result, Operand(left, LSL, 1));
           } else {
             __ LoadImmediate(IP, value);
             __ mul(result, left, IP);
           }
         } else {
           if (value == 2) {
-            __ mov(IP, ShifterOperand(left, ASR, 31));  // IP = sign of left.
-            __ mov(result, ShifterOperand(left, LSL, 1));
+            __ mov(IP, Operand(left, ASR, 31));  // IP = sign of left.
+            __ mov(result, Operand(left, LSL, 1));
             // IP: result bits 32..63.
-            __ cmp(IP, ShifterOperand(result, ASR, 31));
+            __ cmp(IP, Operand(result, ASR, 31));
             __ b(deopt, NE);
           } else {
             if (TargetCPUFeatures::arm_version() == ARMv7) {
               __ LoadImmediate(IP, value);
               __ smull(result, IP, left, IP);
               // IP: result bits 32..63.
-              __ cmp(IP, ShifterOperand(result, ASR, 31));
+              __ cmp(IP, Operand(result, ASR, 31));
               __ b(deopt, NE);
             } else {
               const QRegister qtmp = locs()->temp(0).fpu_reg();
@@ -3164,57 +3164,57 @@
           // case we cannot negate the result.
           __ CompareImmediate(left, 0x80000000);
           __ b(deopt, EQ);
-          __ rsb(result, left, ShifterOperand(0));
+          __ rsb(result, left, Operand(0));
           break;
         }
         ASSERT(Utils::IsPowerOfTwo(Utils::Abs(value)));
         const intptr_t shift_count =
             Utils::ShiftForPowerOfTwo(Utils::Abs(value)) + kSmiTagSize;
         ASSERT(kSmiTagSize == 1);
-        __ mov(IP, ShifterOperand(left, ASR, 31));
+        __ mov(IP, Operand(left, ASR, 31));
         ASSERT(shift_count > 1);  // 1, -1 case handled above.
         const Register temp = locs()->temp(0).reg();
-        __ add(temp, left, ShifterOperand(IP, LSR, 32 - shift_count));
+        __ add(temp, left, Operand(IP, LSR, 32 - shift_count));
         ASSERT(shift_count > 0);
-        __ mov(result, ShifterOperand(temp, ASR, shift_count));
+        __ mov(result, Operand(temp, ASR, shift_count));
         if (value < 0) {
-          __ rsb(result, result, ShifterOperand(0));
+          __ rsb(result, result, Operand(0));
         }
         __ SmiTag(result);
         break;
       }
       case Token::kBIT_AND: {
         // No overflow check.
-        ShifterOperand shifter_op;
-        if (ShifterOperand::CanHold(imm, &shifter_op)) {
-          __ and_(result, left, shifter_op);
-        } else if (ShifterOperand::CanHold(~imm, &shifter_op)) {
-          __ bic(result, left, shifter_op);
+        Operand o;
+        if (Operand::CanHold(imm, &o)) {
+          __ and_(result, left, o);
+        } else if (Operand::CanHold(~imm, &o)) {
+          __ bic(result, left, o);
         } else {
           __ LoadImmediate(IP, imm);
-          __ and_(result, left, ShifterOperand(IP));
+          __ and_(result, left, Operand(IP));
         }
         break;
       }
       case Token::kBIT_OR: {
         // No overflow check.
-        ShifterOperand shifter_op;
-        if (ShifterOperand::CanHold(imm, &shifter_op)) {
-          __ orr(result, left, shifter_op);
+        Operand o;
+        if (Operand::CanHold(imm, &o)) {
+          __ orr(result, left, o);
         } else {
           __ LoadImmediate(IP, imm);
-          __ orr(result, left, ShifterOperand(IP));
+          __ orr(result, left, Operand(IP));
         }
         break;
       }
       case Token::kBIT_XOR: {
         // No overflow check.
-        ShifterOperand shifter_op;
-        if (ShifterOperand::CanHold(imm, &shifter_op)) {
-          __ eor(result, left, shifter_op);
+        Operand o;
+        if (Operand::CanHold(imm, &o)) {
+          __ eor(result, left, o);
         } else {
           __ LoadImmediate(IP, imm);
-          __ eor(result, left, ShifterOperand(IP));
+          __ eor(result, left, Operand(IP));
         }
         break;
       }
@@ -3255,31 +3255,31 @@
   switch (op_kind()) {
     case Token::kADD: {
       if (deopt == NULL) {
-        __ add(result, left, ShifterOperand(right));
+        __ add(result, left, Operand(right));
       } else {
-        __ adds(result, left, ShifterOperand(right));
+        __ adds(result, left, Operand(right));
         __ b(deopt, VS);
       }
       break;
     }
     case Token::kSUB: {
       if (deopt == NULL) {
-        __ sub(result, left, ShifterOperand(right));
+        __ sub(result, left, Operand(right));
       } else {
-        __ subs(result, left, ShifterOperand(right));
+        __ subs(result, left, Operand(right));
         __ b(deopt, VS);
       }
       break;
     }
     case Token::kMUL: {
-      __ Asr(IP, left, kSmiTagSize);  // SmiUntag left into IP.
+      __ SmiUntag(IP, left);
       if (deopt == NULL) {
         __ mul(result, IP, right);
       } else {
         if (TargetCPUFeatures::arm_version() == ARMv7) {
           __ smull(result, IP, IP, right);
           // IP: result bits 32..63.
-          __ cmp(IP, ShifterOperand(result, ASR, 31));
+          __ cmp(IP, Operand(result, ASR, 31));
           __ b(deopt, NE);
         } else {
           const QRegister qtmp = locs()->temp(0).fpu_reg();
@@ -3293,29 +3293,29 @@
     }
     case Token::kBIT_AND: {
       // No overflow check.
-      __ and_(result, left, ShifterOperand(right));
+      __ and_(result, left, Operand(right));
       break;
     }
     case Token::kBIT_OR: {
       // No overflow check.
-      __ orr(result, left, ShifterOperand(right));
+      __ orr(result, left, Operand(right));
       break;
     }
     case Token::kBIT_XOR: {
       // No overflow check.
-      __ eor(result, left, ShifterOperand(right));
+      __ eor(result, left, Operand(right));
       break;
     }
     case Token::kTRUNCDIV: {
       if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
         // Handle divide by zero in runtime.
-        __ cmp(right, ShifterOperand(0));
+        __ cmp(right, Operand(0));
         __ b(deopt, EQ);
       }
       const Register temp = locs()->temp(0).reg();
       const DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
-      __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
-      __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+      __ SmiUntag(temp, left);
+      __ SmiUntag(IP, right);
 
       __ IntegerDivide(result, temp, IP, dtemp, DTMP);
 
@@ -3329,17 +3329,17 @@
     case Token::kMOD: {
       if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
         // Handle divide by zero in runtime.
-        __ cmp(right, ShifterOperand(0));
+        __ cmp(right, Operand(0));
         __ b(deopt, EQ);
       }
       const Register temp = locs()->temp(0).reg();
       const DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
-      __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
-      __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+      __ SmiUntag(temp, left);
+      __ SmiUntag(IP, right);
 
       __ IntegerDivide(result, temp, IP, dtemp, DTMP);
 
-      __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+      __ SmiUntag(IP, right);
       __ mls(result, IP, result, temp);  // result <- left - right * result
       __ SmiTag(result);
       //  res = left % right;
@@ -3351,12 +3351,12 @@
       //    }
       //  }
       Label done;
-      __ cmp(result, ShifterOperand(0));
+      __ cmp(result, Operand(0));
       __ b(&done, GE);
       // Result is negative, adjust it.
-      __ cmp(right, ShifterOperand(0));
-      __ sub(result, result, ShifterOperand(right), LT);
-      __ add(result, result, ShifterOperand(right), GE);
+      __ cmp(right, Operand(0));
+      __ sub(result, result, Operand(right), LT);
+      __ add(result, result, Operand(right), GE);
       __ Bind(&done);
       break;
     }
@@ -3365,7 +3365,7 @@
         __ CompareImmediate(right, 0);
         __ b(deopt, LT);
       }
-      __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+      __ SmiUntag(IP, right);
       // sarl operation masks the count to 5 bits.
       const intptr_t kCountLimit = 0x1F;
       if ((right_range == NULL) ||
@@ -3374,7 +3374,7 @@
         __ LoadImmediate(IP, kCountLimit, GT);
       }
       const Register temp = locs()->temp(0).reg();
-      __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
+      __ SmiUntag(temp, left);
       __ Asr(result, temp, IP);
       __ SmiTag(result);
       break;
@@ -3422,14 +3422,14 @@
   const Register left = locs()->in(0).reg();
   const Register right = locs()->in(1).reg();
   if (this->left()->definition() == this->right()->definition()) {
-    __ tst(left, ShifterOperand(kSmiTagMask));
+    __ tst(left, Operand(kSmiTagMask));
   } else if (left_cid == kSmiCid) {
-    __ tst(right, ShifterOperand(kSmiTagMask));
+    __ tst(right, Operand(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
-    __ tst(left, ShifterOperand(kSmiTagMask));
+    __ tst(left, Operand(kSmiTagMask));
   } else {
-    __ orr(IP, left, ShifterOperand(right));
-    __ tst(IP, ShifterOperand(kSmiTagMask));
+    __ orr(IP, left, Operand(right));
+    __ tst(IP, Operand(kSmiTagMask));
   }
   __ b(deopt, EQ);
 }
@@ -3471,13 +3471,10 @@
   const intptr_t kNumInputs = 1;
   const intptr_t value_cid = value()->Type()->ToCid();
   const bool needs_temp = ((value_cid != kSmiCid) && (value_cid != kDoubleCid));
-  const bool needs_writable_input = (value_cid == kSmiCid);
   const intptr_t kNumTemps = needs_temp ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, needs_writable_input
-                     ? Location::WritableRegister()
-                     : Location::RequiresRegister());
+  summary->set_in(0, Location::RequiresRegister());
   if (needs_temp) summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3493,8 +3490,8 @@
   if (value_cid == kDoubleCid) {
     __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag);
   } else if (value_cid == kSmiCid) {
-    __ SmiUntag(value);  // Untag input before conversion.
-    __ vmovsr(STMP, value);
+    __ SmiUntag(IP, value);
+    __ vmovsr(STMP, IP);
     __ vcvtdi(result, STMP);
   } else {
     Label* deopt = compiler->AddDeoptStub(deopt_id_,
@@ -3509,7 +3506,7 @@
           Double::value_offset() - kHeapObjectTag);
     } else {
       Label is_smi, done;
-      __ tst(value, ShifterOperand(kSmiTagMask));
+      __ tst(value, Operand(kSmiTagMask));
       __ b(&is_smi, EQ);
       __ CompareClassId(value, kDoubleCid, temp);
       __ b(deopt, NE);
@@ -3517,8 +3514,7 @@
           Double::value_offset() - kHeapObjectTag);
       __ b(&done);
       __ Bind(&is_smi);
-      // TODO(regis): Why do we preserve value here but not above?
-      __ mov(IP, ShifterOperand(value, ASR, 1));  // Copy and untag.
+      __ SmiUntag(IP, value);
       __ vmovsr(STMP, IP);
       __ vcvtdi(result, STMP);
       __ Bind(&done);
@@ -3586,7 +3582,7 @@
   if (value_cid != kFloat32x4Cid) {
     const Register temp = locs()->temp(0).reg();
     Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
-    __ tst(value, ShifterOperand(kSmiTagMask));
+    __ tst(value, Operand(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kFloat32x4Cid, temp);
     __ b(deopt, NE);
@@ -3657,7 +3653,7 @@
   if (value_cid != kFloat64x2Cid) {
     const Register temp = locs()->temp(0).reg();
     Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
-    __ tst(value, ShifterOperand(kSmiTagMask));
+    __ tst(value, Operand(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kFloat64x2Cid, temp);
     __ b(deopt, NE);
@@ -3695,7 +3691,7 @@
     const Class& int32x4_class = compiler->int32x4_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class));
-    const ExternalLabel label(int32x4_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -3705,7 +3701,7 @@
                            &label,
                            PcDescriptors::kOther,
                            locs);
-    __ mov(locs->out(0).reg(), ShifterOperand(R0));
+    __ mov(locs->out(0).reg(), Operand(R0));
     compiler->RestoreLiveRegisters(locs);
 
     __ b(exit_label());
@@ -3759,7 +3755,7 @@
   if (value_cid != kInt32x4Cid) {
     const Register temp = locs()->temp(0).reg();
     Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
-    __ tst(value, ShifterOperand(kSmiTagMask));
+    __ tst(value, Operand(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kInt32x4Cid, temp);
     __ b(deopt, NE);
@@ -4040,15 +4036,15 @@
   // Y lane.
   __ vmovrs(temp, OddSRegisterOf(dvalue0));
   __ Lsr(temp, temp, 31);
-  __ orr(out, out, ShifterOperand(temp, LSL, 1));
+  __ orr(out, out, Operand(temp, LSL, 1));
   // Z lane.
   __ vmovrs(temp, EvenSRegisterOf(dvalue1));
   __ Lsr(temp, temp, 31);
-  __ orr(out, out, ShifterOperand(temp, LSL, 2));
+  __ orr(out, out, Operand(temp, LSL, 2));
   // W lane.
   __ vmovrs(temp, OddSRegisterOf(dvalue1));
   __ Lsr(temp, temp, 31);
-  __ orr(out, out, ShifterOperand(temp, LSL, 3));
+  __ orr(out, out, Operand(temp, LSL, 3));
   // Tag.
   __ SmiTag(out);
 }
@@ -4570,7 +4566,6 @@
     // Grabbing the S components means we need a low (< 7) Q.
     summary->set_in(0, Location::FpuRegisterLocation(Q6));
     summary->set_out(0, Location::RequiresRegister());
-    summary->AddTemp(Location::RequiresRegister());
   } else {
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresFpuRegister());
@@ -4587,15 +4582,14 @@
     const DRegister dvalue1 = OddDRegisterOf(q);
 
     const Register out = locs()->out(0).reg();
-    const Register temp = locs()->temp(0).reg();
 
     // Upper 32-bits of X lane.
     __ vmovrs(out, OddSRegisterOf(dvalue0));
     __ Lsr(out, out, 31);
     // Upper 32-bits of Y lane.
-    __ vmovrs(temp, OddSRegisterOf(dvalue1));
-    __ Lsr(temp, temp, 31);
-    __ orr(out, out, ShifterOperand(temp, LSL, 1));
+    __ vmovrs(TMP, OddSRegisterOf(dvalue1));
+    __ Lsr(TMP, TMP, 31);
+    __ orr(out, out, Operand(TMP, LSL, 1));
     // Tag.
     __ SmiTag(out);
     return;
@@ -4787,7 +4781,7 @@
     default: UNREACHABLE();
   }
 
-  __ tst(result, ShifterOperand(result));
+  __ tst(result, Operand(result));
   __ LoadObject(result, Bool::True(), NE);
   __ LoadObject(result, Bool::False(), EQ);
 }
@@ -5046,7 +5040,7 @@
     // - max -> left is negative ? right : left
     // Check the sign bit.
     __ vmovrrd(IP, temp, left);  // Sign bit is in bit 31 of temp.
-    __ cmp(temp, ShifterOperand(0));
+    __ cmp(temp, Operand(0));
     if (is_min) {
       ASSERT(left == result);
       __ vmovd(result, right, GE);
@@ -5062,12 +5056,12 @@
   const Register left = locs()->in(0).reg();
   const Register right = locs()->in(1).reg();
   const Register result = locs()->out(0).reg();
-  __ cmp(left, ShifterOperand(right));
+  __ cmp(left, Operand(right));
   ASSERT(result == left);
   if (is_min) {
-    __ mov(result, ShifterOperand(right), GT);
+    __ mov(result, Operand(right), GT);
   } else {
-    __ mov(result, ShifterOperand(right), LT);
+    __ mov(result, Operand(right), LT);
   }
 }
 
@@ -5092,14 +5086,14 @@
   switch (op_kind()) {
     case Token::kNEGATE: {
       Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
-      __ rsbs(result, value, ShifterOperand(0));
+      __ rsbs(result, value, Operand(0));
       __ b(deopt, VS);
       break;
     }
     case Token::kBIT_NOT:
-      __ mvn(result, ShifterOperand(value));
+      __ mvn(result, Operand(value));
       // Remove inverted smi-tag.
-      __ bic(result, result, ShifterOperand(kSmiTagMask));
+      __ bic(result, result, Operand(kSmiTagMask));
       break;
     default:
       UNREACHABLE();
@@ -5132,7 +5126,7 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* result = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  result->set_in(0, Location::WritableRegister());
+  result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
 }
@@ -5141,8 +5135,8 @@
 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register value = locs()->in(0).reg();
   const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
-  __ SmiUntag(value);
-  __ vmovsr(STMP, value);
+  __ SmiUntag(IP, value);
+  __ vmovsr(STMP, IP);
   __ vcvtdi(result, STMP);
 }
 
@@ -5514,7 +5508,7 @@
     ASSERT(representation() == kTagged);
     const Register out = locs()->out(0).reg();
     const Register in = in_loc.reg();
-    __ mov(out, ShifterOperand(in));
+    __ mov(out, Operand(in));
   }
 }
 
@@ -5555,14 +5549,14 @@
     Range* right_range = InputAt(1)->definition()->range();
     if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
       // Handle divide by zero in runtime.
-      __ cmp(right, ShifterOperand(0));
+      __ cmp(right, Operand(0));
       __ b(deopt, EQ);
     }
     const Register temp = locs()->temp(0).reg();
     const DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
 
-    __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
-    __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+    __ SmiUntag(temp, left);
+    __ SmiUntag(IP, right);
 
     __ IntegerDivide(result_div, temp, IP, dtemp, DTMP);
 
@@ -5570,7 +5564,7 @@
     // case we cannot tag the result.
     __ CompareImmediate(result_div, 0x40000000);
     __ b(deopt, EQ);
-    __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
+    __ SmiUntag(IP, right);
     // result_mod <- left - right * result_div.
     __ mls(result_mod, IP, result_div, temp);
     __ SmiTag(result_div);
@@ -5585,12 +5579,12 @@
     //    }
     //  }
     Label done;
-    __ cmp(result_mod, ShifterOperand(0));
+    __ cmp(result_mod, Operand(0));
     __ b(&done, GE);
     // Result is negative, adjust it.
-    __ cmp(right, ShifterOperand(0));
-    __ sub(result_mod, result_mod, ShifterOperand(right), LT);
-    __ add(result_mod, result_mod, ShifterOperand(right), GE);
+    __ cmp(right, Operand(0));
+    __ sub(result_mod, result_mod, Operand(right), LT);
+    __ add(result_mod, result_mod, Operand(right), GE);
     __ Bind(&done);
 
     return;
@@ -5693,11 +5687,11 @@
   Label is_ok;
   intptr_t cix = 0;
   if (unary_checks().GetReceiverClassIdAt(cix) == kSmiCid) {
-    __ tst(value, ShifterOperand(kSmiTagMask));
+    __ tst(value, Operand(kSmiTagMask));
     __ b(&is_ok, EQ);
     cix++;  // Skip first check.
   } else {
-    __ tst(value, ShifterOperand(kSmiTagMask));
+    __ tst(value, Operand(kSmiTagMask));
     __ b(deopt, EQ);
   }
   __ LoadClassId(temp, value);
@@ -5729,7 +5723,7 @@
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register value = locs()->in(0).reg();
   Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi);
-  __ tst(value, ShifterOperand(kSmiTagMask));
+  __ tst(value, Operand(kSmiTagMask));
   __ b(deopt, NE);
 }
 
@@ -5776,7 +5770,7 @@
   } else {
     const Register length = length_loc.reg();
     const Register index = index_loc.reg();
-    __ cmp(index, ShifterOperand(length));
+    __ cmp(index, Operand(length));
     __ b(deopt, CS);
   }
 }
@@ -5840,7 +5834,7 @@
                       Mint::value_offset() - kHeapObjectTag + kWordSize);
   } else if (value_cid == kSmiCid) {
     // Load Smi into result_lo.
-    __ mov(result_lo, ShifterOperand(value));
+    __ mov(result_lo, Operand(value));
     // Untag.
     __ SmiUntag(result_lo);
     __ SignFill(result_hi, result_lo);
@@ -5849,7 +5843,7 @@
     Label* deopt = compiler->AddDeoptStub(deopt_id_,
                                           ICData::kDeoptUnboxInteger);
     Label is_smi, done;
-    __ tst(value, ShifterOperand(kSmiTagMask));
+    __ tst(value, Operand(kSmiTagMask));
     __ b(&is_smi, EQ);
     __ CompareClassId(value, kMintCid, temp);
     __ b(deopt, NE);
@@ -5870,7 +5864,7 @@
     // It's a Smi.
     __ Bind(&is_smi);
     // Load Smi into result_lo.
-    __ mov(result_lo, ShifterOperand(value));
+    __ mov(result_lo, Operand(value));
     // Untag.
     __ SmiUntag(result_lo);
     // Sign extend result_lo into result_hi.
@@ -5908,7 +5902,7 @@
         Class::ZoneHandle(Isolate::Current()->object_store()->mint_class());
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(mint_class));
-    const ExternalLabel label(mint_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -5918,7 +5912,7 @@
                            &label,
                            PcDescriptors::kOther,
                            locs);
-    __ mov(locs->out(0).reg(), ShifterOperand(R0));
+    __ mov(locs->out(0).reg(), Operand(R0));
     compiler->RestoreLiveRegisters(locs);
 
     __ b(exit_label());
@@ -5963,7 +5957,7 @@
 
   // lo is a Smi. Tag it and return.
   __ Bind(&is_smi);
-  __ mov(out_reg, ShifterOperand(value_lo));
+  __ mov(out_reg, Operand(value_lo));
   __ SmiTag(out_reg);
   __ b(&done);
 
@@ -6020,18 +6014,18 @@
   }
   switch (op_kind()) {
     case Token::kBIT_AND: {
-      __ and_(out_lo, left_lo, ShifterOperand(right_lo));
-      __ and_(out_hi, left_hi, ShifterOperand(right_hi));
+      __ and_(out_lo, left_lo, Operand(right_lo));
+      __ and_(out_hi, left_hi, Operand(right_hi));
     }
     break;
     case Token::kBIT_OR: {
-      __ orr(out_lo, left_lo, ShifterOperand(right_lo));
-      __ orr(out_hi, left_hi, ShifterOperand(right_hi));
+      __ orr(out_lo, left_lo, Operand(right_lo));
+      __ orr(out_hi, left_hi, Operand(right_hi));
     }
     break;
     case Token::kBIT_XOR: {
-     __ eor(out_lo, left_lo, ShifterOperand(right_lo));
-     __ eor(out_hi, left_hi, ShifterOperand(right_hi));
+     __ eor(out_lo, left_lo, Operand(right_lo));
+     __ eor(out_hi, left_hi, Operand(right_hi));
     }
     break;
     case Token::kADD:
@@ -6040,12 +6034,12 @@
         deopt  = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryMintOp);
       }
       if (op_kind() == Token::kADD) {
-        __ adds(out_lo, left_lo, ShifterOperand(right_lo));
-        __ adcs(out_hi, left_hi, ShifterOperand(right_hi));
+        __ adds(out_lo, left_lo, Operand(right_lo));
+        __ adcs(out_hi, left_hi, Operand(right_hi));
       } else {
         ASSERT(op_kind() == Token::kSUB);
-        __ subs(out_lo, left_lo, ShifterOperand(right_lo));
-        __ sbcs(out_hi, left_hi, ShifterOperand(right_hi));
+        __ subs(out_lo, left_lo, Operand(right_lo));
+        __ sbcs(out_hi, left_hi, Operand(right_hi));
       }
       // Deopt on overflow.
       __ b(deopt, VS);
@@ -6092,8 +6086,8 @@
 
   // Early out if shift is 0.
   __ CompareImmediate(shift, 0);
-  __ mov(out_lo, ShifterOperand(left_lo));
-  __ mov(out_hi, ShifterOperand(left_hi));
+  __ mov(out_lo, Operand(left_lo));
+  __ mov(out_hi, Operand(left_hi));
   __ b(&done, EQ);
 
   // Untag shift count.
@@ -6109,34 +6103,34 @@
 
   switch (op_kind()) {
     case Token::kSHR: {
-      __ cmp(shift, ShifterOperand(32));
+      __ cmp(shift, Operand(32));
 
-      __ mov(out_lo, ShifterOperand(out_hi), HI);
+      __ mov(out_lo, Operand(out_hi), HI);
       __ Asr(out_hi, out_hi, 31, HI);
-      __ sub(shift, shift, ShifterOperand(32), HI);
+      __ sub(shift, shift, Operand(32), HI);
 
-      __ rsb(temp, shift, ShifterOperand(32));
-      __ mov(temp, ShifterOperand(out_hi, LSL, temp));
-      __ orr(out_lo, temp, ShifterOperand(out_lo, LSR, shift));
+      __ rsb(temp, shift, Operand(32));
+      __ mov(temp, Operand(out_hi, LSL, temp));
+      __ orr(out_lo, temp, Operand(out_lo, LSR, shift));
       __ Asr(out_hi, out_hi, shift);
       break;
     }
     case Token::kSHL: {
-      __ rsbs(temp, shift, ShifterOperand(32));
-      __ sub(temp, shift, ShifterOperand(32), MI);
-      __ mov(out_hi, ShifterOperand(out_lo, LSL, temp), MI);
-      __ mov(out_hi, ShifterOperand(out_hi, LSL, shift), PL);
-      __ orr(out_hi, out_hi, ShifterOperand(out_lo, LSR, temp), PL);
-      __ mov(out_lo, ShifterOperand(out_lo, LSL, shift));
+      __ rsbs(temp, shift, Operand(32));
+      __ sub(temp, shift, Operand(32), MI);
+      __ mov(out_hi, Operand(out_lo, LSL, temp), MI);
+      __ mov(out_hi, Operand(out_hi, LSL, shift), PL);
+      __ orr(out_hi, out_hi, Operand(out_lo, LSR, temp), PL);
+      __ mov(out_lo, Operand(out_lo, LSL, shift));
 
       // Check for overflow.
 
       // Copy high word from output.
-      __ mov(temp, ShifterOperand(out_hi));
+      __ mov(temp, Operand(out_hi));
       // Shift copy right.
       __ Asr(temp, temp, shift);
       // Compare with high word from input.
-      __ cmp(temp, ShifterOperand(left_hi));
+      __ cmp(temp, Operand(left_hi));
       // Overflow if they aren't equal.
       __ b(deopt, NE);
       break;
@@ -6182,8 +6176,8 @@
   if (FLAG_throw_on_javascript_int_overflow) {
     deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryMintOp);
   }
-  __ mvn(out_lo, ShifterOperand(left_lo));
-  __ mvn(out_hi, ShifterOperand(left_hi));
+  __ mvn(out_lo, Operand(left_lo));
+  __ mvn(out_hi, Operand(left_hi));
   if (FLAG_throw_on_javascript_int_overflow) {
     EmitJavascriptIntOverflowCheck(compiler, deopt, out_lo, out_hi);
   }
@@ -6284,14 +6278,15 @@
 
 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  return LocationSummary::Make(0,
+  return LocationSummary::Make(isolate,
+                               0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
 
 
 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ mov(locs()->out(0).reg(), ShifterOperand(CTX));
+  __ mov(locs()->out(0).reg(), Operand(CTX));
 }
 
 
@@ -6371,7 +6366,8 @@
 
 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
                                                          bool opt) const {
-  return LocationSummary::Make(1,
+  return LocationSummary::Make(isolate,
+                               1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -6382,7 +6378,7 @@
   const Register result = locs()->out(0).reg();
 
   __ LoadObject(result, Bool::True());
-  __ cmp(result, ShifterOperand(value));
+  __ cmp(result, Operand(value));
   __ LoadObject(result, Bool::False(), EQ);
 }
 
@@ -6395,7 +6391,7 @@
 
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls()));
-  const ExternalLabel label(cls().ToCString(), stub.EntryPoint());
+  const ExternalLabel label(stub.EntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
                          PcDescriptors::kOther,
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index b33c192..4354d22 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -238,7 +238,8 @@
 
 LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
                                                      bool opt) const {
-  return LocationSummary::Make(0,
+  return LocationSummary::Make(isolate,
+                               0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -252,7 +253,8 @@
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
-  return LocationSummary::Make(1,
+  return LocationSummary::Make(isolate,
+                               1,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
@@ -268,7 +270,8 @@
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
                                                     bool opt) const {
-  return LocationSummary::Make(0,
+  return LocationSummary::Make(isolate,
+                               0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -286,7 +289,8 @@
 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresFpuRegister(),
                                LocationSummary::kNoCall);
 }
@@ -801,7 +805,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -822,7 +827,8 @@
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -871,7 +877,8 @@
 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -887,7 +894,8 @@
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -976,6 +984,24 @@
 }
 
 
+static bool CanBeImmediateIndex(Value* value, intptr_t cid, bool is_external) {
+  ConstantInstr* constant = value->definition()->AsConstant();
+  if ((constant == NULL) || !constant->value().IsSmi()) {
+    return false;
+  }
+  const int64_t index = Smi::Cast(constant->value()).AsInt64Value();
+  const intptr_t scale = Instance::ElementSizeFor(cid);
+  const int64_t offset = index * scale +
+      (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
+  if (!Utils::IsInt(32, offset)) {
+    return false;
+  }
+  return Address::CanHoldOffset(static_cast<int32_t>(offset),
+                                Address::Offset,
+                                Address::OperandSizeFor(cid));
+}
+
+
 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -983,10 +1009,11 @@
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
-  // The smi index is either untagged (element size == 1), or it is left smi
-  // tagged (for all element sizes > 1).
-  // TODO(regis): Revisit and see if the index can be immediate.
-  locs->set_in(1, Location::WritableRegister());
+  if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
+    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+  } else {
+    locs->set_in(1, Location::RequiresRegister());
+  }
   if ((representation() == kUnboxedDouble)    ||
       (representation() == kUnboxedFloat32x4) ||
       (representation() == kUnboxedInt32x4)   ||
@@ -999,52 +1026,61 @@
 }
 
 
+static Address ElementAddressForIntIndex(bool is_external,
+                                         intptr_t cid,
+                                         intptr_t index_scale,
+                                         Register array,
+                                         intptr_t index) {
+  const int64_t offset = index * index_scale +
+      (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
+  ASSERT(Utils::IsInt(32, offset));
+  const OperandSize size = Address::OperandSizeFor(cid);
+  ASSERT(Address::CanHoldOffset(offset, Address::Offset, size));
+  return Address(array, static_cast<int32_t>(offset), Address::Offset, size);
+}
+
+
+static Address ElementAddressForRegIndex(Assembler* assembler,
+                                         bool is_load,
+                                         bool is_external,
+                                         intptr_t cid,
+                                         intptr_t index_scale,
+                                         Register array,
+                                         Register index) {
+  // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays.
+  const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift;
+  const int32_t offset =
+      is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag);
+  ASSERT(array != TMP);
+  ASSERT(index != TMP);
+  const Register base = is_load ? TMP : index;
+  if ((offset == 0) && (shift == 0)) {
+    return Address(array, index, UXTX, Address::Unscaled);
+  } else if (shift < 0) {
+    ASSERT(shift == -1);
+    assembler->add(base, array, Operand(index, ASR, 1));
+  } else {
+    assembler->add(base, array, Operand(index, LSL, shift));
+  }
+  const OperandSize size = Address::OperandSizeFor(cid);
+  ASSERT(Address::CanHoldOffset(offset, Address::Offset, size));
+  return Address(base, offset, Address::Offset, size);
+}
+
+
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register array = locs()->in(0).reg();
-  ASSERT(locs()->in(1).IsRegister());  // TODO(regis): Revisit.
-  const Register index = locs()->in(1).reg();
-
-  Address element_address(kNoRegister, 0);
-
   // The array register points to the backing store for external arrays.
-  intptr_t offset = 0;
-  if (!IsExternal()) {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    offset = Instance::DataOffsetFor(class_id()) - kHeapObjectTag;
-  }
+  const Register array = locs()->in(0).reg();
+  const Location index = locs()->in(1);
 
-  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
-  // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
-  // index is expected to be untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  switch (index_scale()) {
-    case 1:
-      __ add(index, array, Operand(index, ASR, kSmiTagSize));
-      element_address = Address(index, offset);
-      break;
-    case 2:
-      if (offset != 0) {
-        __ add(index, array, Operand(index));
-        element_address = Address(index, offset);
-      } else {
-        element_address = Address(array, index, UXTX, Address::Unscaled);
-      }
-      break;
-    case 4:
-      __ add(index, array, Operand(index, LSL, 1));
-      element_address = Address(index, offset);
-      break;
-    case 8:
-      __ add(index, array, Operand(index, LSL, 2));
-      element_address = Address(index, offset);
-      break;
-    case 16:
-      __ add(index, array, Operand(index, LSL, 3));
-      element_address = Address(index, offset);
-      break;
-    default:
-      UNREACHABLE();
-  }
+  Address element_address = index.IsRegister()
+      ? ElementAddressForRegIndex(compiler->assembler(),
+                                  true,  // Load.
+                                  IsExternal(), class_id(), index_scale(),
+                                  array, index.reg())
+      : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
+                                  array, Smi::Cast(index.constant()).Value());
+  // Warning: element_address may use register TMP as base.
 
   if ((representation() == kUnboxedDouble)    ||
       (representation() == kUnboxedFloat32x4) ||
@@ -1065,6 +1101,8 @@
       case kTypedDataFloat32x4ArrayCid:
         __ fldrq(result, element_address);
         break;
+      default:
+        UNREACHABLE();
     }
     return;
   }
@@ -1152,10 +1190,11 @@
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
-  // The smi index is either untagged (element size == 1), or it is left smi
-  // tagged (for all element sizes > 1).
-  // TODO(regis): Revisit and see if the index can be immediate.
-  locs->set_in(1, Location::WritableRegister());
+  if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
+    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+  } else {
+    locs->set_in(1, Location::WritableRegister());
+  }
   switch (class_id()) {
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
@@ -1170,11 +1209,9 @@
     case kOneByteStringCid:
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid:
-      locs->set_in(2, Location::WritableRegister());
-      break;
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      locs->set_in(2, Location::WritableRegister());
+      locs->set_in(2, Location::RequiresRegister());
       break;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:  // TODO(srdjan): Support Float64 constants.
@@ -1194,56 +1231,17 @@
 
 
 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register array = locs()->in(0).reg();
-  ASSERT(locs()->in(1).IsRegister());  // TODO(regis): Revisit.
-  const Register index = locs()->in(1).reg();
-
-  Address element_address(kNoRegister, 0);
-
   // The array register points to the backing store for external arrays.
-  intptr_t offset = 0;
-  if (!IsExternal()) {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    offset = Instance::DataOffsetFor(class_id()) - kHeapObjectTag;
-  }
+  const Register array = locs()->in(0).reg();
+  const Location index = locs()->in(1);
 
-  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
-  // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
-  // index is expected to be untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  switch (index_scale()) {
-    case 1: {
-      __ add(index, array, Operand(index, ASR, kSmiTagSize));
-      element_address = Address(index, offset);
-      break;
-    }
-    case 2: {
-      if (offset != 0) {
-        __ add(index, array, Operand(index));
-        element_address = Address(index, offset);
-      } else {
-        element_address = Address(array, index, UXTX, Address::Unscaled);
-      }
-      break;
-    }
-    case 4: {
-      __ add(index, array, Operand(index, LSL, 1));
-      element_address = Address(index, offset);
-      break;
-    }
-    case 8: {
-      __ add(index, array, Operand(index, LSL, 2));
-      element_address = Address(index, offset);
-      break;
-    }
-    case 16: {
-      __ add(index, array, Operand(index, LSL, 3));
-      element_address = Address(index, offset);
-      break;
-    }
-    default:
-      UNREACHABLE();
-  }
+  Address element_address = index.IsRegister()
+      ? ElementAddressForRegIndex(compiler->assembler(),
+                                  false,  // Store.
+                                  IsExternal(), class_id(), index_scale(),
+                                  array, index.reg())
+      : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
+                                  array, Smi::Cast(index.constant()).Value());
 
   switch (class_id()) {
     case kArrayCid:
@@ -1268,8 +1266,8 @@
         __ str(TMP, element_address, kUnsignedByte);
       } else {
         const Register value = locs()->in(2).reg();
-        __ SmiUntag(value);
-        __ str(value, element_address, kUnsignedByte);
+        __ SmiUntag(TMP, value);
+        __ str(TMP, element_address, kUnsignedByte);
       }
       break;
     }
@@ -1288,32 +1286,27 @@
         __ str(TMP, element_address, kUnsignedByte);
       } else {
         const Register value = locs()->in(2).reg();
-        Label store_value;
-        __ SmiUntag(value);
-        __ CompareImmediate(value, 0xFF, PP);
+        __ CompareImmediate(value, 0x1FE, PP);  // Smi value and smi 0xFF.
         // Clamp to 0x00 or 0xFF respectively.
-        __ b(&store_value, LS);
-        __ LoadImmediate(TMP, 0x00, PP);
-        __ LoadImmediate(TMP2, 0xFF, PP);
-        __ csel(value, TMP, value, LE);
-        __ csel(value, TMP2, value, GT);
-        __ Bind(&store_value);
-        __ str(value, element_address, kUnsignedByte);
+        __ csetm(TMP, GT);  // TMP = value > 0x1FE ? -1 : 0.
+        __ csel(TMP, value, TMP, LS);  // TMP = value in range ? value : TMP.
+        __ SmiUntag(TMP);
+        __ str(TMP, element_address, kUnsignedByte);
       }
       break;
     }
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid: {
       const Register value = locs()->in(2).reg();
-      __ SmiUntag(value);
-      __ str(value, element_address, kUnsignedHalfword);
+      __ SmiUntag(TMP, value);
+      __ str(TMP, element_address, kUnsignedHalfword);
       break;
     }
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid: {
       const Register value = locs()->in(2).reg();
-      __ SmiUntag(value);
-      __ str(value, element_address, kUnsignedWord);
+      __ SmiUntag(TMP, value);
+      __ str(TMP, element_address, kUnsignedWord);
       break;
     }
     case kTypedDataFloat32ArrayCid: {
@@ -1690,7 +1683,7 @@
 
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(cls_));
-    const ExternalLabel label(cls_.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2058,7 +2051,7 @@
     const Class& double_class = compiler->double_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(double_class));
-    const ExternalLabel label(double_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2090,7 +2083,7 @@
     const Class& float32x4_class = compiler->float32x4_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class));
-    const ExternalLabel label(float32x4_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2122,7 +2115,7 @@
     const Class& float64x2_class = compiler->float64x2_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class));
-    const ExternalLabel label(float64x2_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2400,8 +2393,7 @@
   ASSERT(locs()->out(0).reg() == R0);
 
   __ LoadImmediate(R1, num_context_variables(), PP);
-  const ExternalLabel label("alloc_context",
-                            StubCode::AllocateContextEntryPoint());
+  const ExternalLabel label(StubCode::AllocateContextEntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
                          PcDescriptors::kOther,
@@ -2644,7 +2636,7 @@
             reinterpret_cast<int64_t>(Smi::New(max_right)), PP);
         __ b(deopt, CS);
       }
-      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+      __ SmiUntag(TMP, right);
       __ lslv(result, left, TMP);
     }
     if (FLAG_throw_on_javascript_int_overflow) {
@@ -2669,11 +2661,11 @@
       __ CompareImmediate(
           right, reinterpret_cast<int64_t>(Smi::New(Smi::kBits)), PP);
       __ csel(result, ZR, result, CS);
-      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+      __ SmiUntag(TMP, right);
       __ lslv(TMP, left, TMP);
       __ csel(result, TMP, result, CC);
     } else {
-      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+      __ SmiUntag(TMP, right);
       __ lslv(result, left, TMP);
     }
   } else {
@@ -2685,7 +2677,7 @@
     }
     // Left is not a constant.
     // Check if count too large for handling it inlined.
-    __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+    __ SmiUntag(TMP, right);
     // Overflow test (preserve left, right, and TMP);
     const Register temp = locs.temp(0).reg();
     __ lslv(temp, left, TMP);
@@ -2901,7 +2893,7 @@
       break;
     }
     case Token::kMUL: {
-      __ Asr(TMP, left, kSmiTagSize);  // SmiUntag left into TMP.
+      __ SmiUntag(TMP, left);
       if (deopt == NULL) {
         __ mul(result, TMP, right);
       } else {
@@ -2935,8 +2927,8 @@
         __ b(deopt, EQ);
       }
       const Register temp = TMP2;
-      __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
-      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into IP.
+      __ SmiUntag(temp, left);
+      __ SmiUntag(TMP, right);
 
       __ sdiv(result, temp, TMP);
 
@@ -2954,12 +2946,12 @@
         __ b(deopt, EQ);
       }
       const Register temp = TMP2;
-      __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
-      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into IP.
+      __ SmiUntag(temp, left);
+      __ SmiUntag(TMP, right);
 
       __ sdiv(result, temp, TMP);
 
-      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into IP.
+      __ SmiUntag(TMP, right);
       __ msub(result, TMP, result, temp);  // result <- left - right * result
       __ SmiTag(result);
       //  res = left % right;
@@ -2986,7 +2978,7 @@
         __ CompareRegisters(right, ZR);
         __ b(deopt, LT);
       }
-      __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+      __ SmiUntag(TMP, right);
       // sarl operation masks the count to 6 bits.
       const intptr_t kCountLimit = 0x3F;
       if ((right_range == NULL) ||
@@ -2996,7 +2988,7 @@
         __ csel(TMP, TMP2, TMP, GT);
       }
       const Register temp = locs()->temp(0).reg();
-      __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
+      __ SmiUntag(temp, left);
       __ asrv(result, temp, TMP);
       __ SmiTag(result);
       break;
@@ -3274,7 +3266,7 @@
     const Class& int32x4_class = compiler->int32x4_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class));
-    const ExternalLabel label(int32x4_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -3624,37 +3616,107 @@
 
 LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate,
                                                                bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister left = locs()->in(0).fpu_reg();
+  const VRegister right = locs()->in(1).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat32x4Equal:
+      __ vceqs(result, left, right);
+      break;
+    case MethodRecognizer::kFloat32x4NotEqual:
+      __ vceqs(result, left, right);
+      // Invert the result.
+      __ vnot(result, result);
+      break;
+    case MethodRecognizer::kFloat32x4GreaterThan:
+      __ vcgts(result, left, right);
+      break;
+    case MethodRecognizer::kFloat32x4GreaterThanOrEqual:
+      __ vcges(result, left, right);
+      break;
+    case MethodRecognizer::kFloat32x4LessThan:
+      __ vcgts(result, right, left);
+      break;
+    case MethodRecognizer::kFloat32x4LessThanOrEqual:
+      __ vcges(result, right, left);
+      break;
+
+    default: UNREACHABLE();
+  }
 }
 
 
 LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister left = locs()->in(0).fpu_reg();
+  const VRegister right = locs()->in(1).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat32x4Min:
+      __ vmins(result, left, right);
+      break;
+    case MethodRecognizer::kFloat32x4Max:
+      __ vmaxs(result, left, right);
+      break;
+    default: UNREACHABLE();
+  }
 }
 
 
 LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate,
                                                          bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister left = locs()->in(0).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat32x4Sqrt:
+      __ vsqrts(result, left);
+      break;
+    case MethodRecognizer::kFloat32x4Reciprocal:
+      __ VRecps(result, left);
+      break;
+    case MethodRecognizer::kFloat32x4ReciprocalSqrt:
+      __ VRSqrts(result, left);
+      break;
+    default: UNREACHABLE();
+  }
 }
 
 
@@ -3717,13 +3779,25 @@
 
 LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 3;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_in(2, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister left = locs()->in(0).fpu_reg();
+  const VRegister lower = locs()->in(1).fpu_reg();
+  const VRegister upper = locs()->in(2).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+  __ vmins(result, left, upper);
+  __ vmaxs(result, result, lower);
 }
 
 
@@ -3872,7 +3946,7 @@
   const VRegister v1 = locs()->in(1).fpu_reg();
   const VRegister r = locs()->out(0).fpu_reg();
   __ vinsd(r, 0, v0, 0);
-  __ vinsd(r, 0, v1, 0);
+  __ vinsd(r, 1, v1, 0);
 }
 
 
@@ -3934,13 +4008,55 @@
 
 LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
                                                             bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+
+  if (representation() == kTagged) {
+    ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
+    summary->set_in(0, Location::RequiresFpuRegister());
+    summary->set_out(0, Location::RequiresRegister());
+  } else {
+    summary->set_in(0, Location::RequiresFpuRegister());
+    summary->set_out(0, Location::RequiresFpuRegister());
+  }
+  return summary;
 }
 
 
 void Float64x2ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister value = locs()->in(0).fpu_reg();
+
+  if ((op_kind() == MethodRecognizer::kFloat64x2GetSignMask)) {
+    const Register out = locs()->out(0).reg();
+
+    // Bits of X lane.
+    __ vmovrd(out, value, 0);
+    __ Lsr(out, out, 63);
+    // Bits of Y lane.
+    __ vmovrd(TMP, value, 1);
+    __ Lsr(TMP, TMP, 63);
+    __ orr(out, out, Operand(TMP, LSL, 1));
+    // Tag.
+    __ SmiTag(out);
+    return;
+  }
+  ASSERT(representation() == kUnboxedFloat64x2);
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat64x2Negate:
+      __ vnegd(result, value);
+      break;
+    case MethodRecognizer::kFloat64x2Abs:
+      __ vabsd(result, value);
+      break;
+    case MethodRecognizer::kFloat64x2Sqrt:
+      __ vsqrtd(result, value);
+      break;
+    default: UNREACHABLE();
+  }
 }
 
 
@@ -3965,7 +4081,8 @@
 
   switch (op_kind()) {
     case MethodRecognizer::kFloat64x2Scale:
-      __ vmuld(out, left, right);
+      __ vdupd(VTMP, right, 0);
+      __ vmuld(out, left, VTMP);
       break;
     case MethodRecognizer::kFloat64x2WithX:
       __ vinsd(out, 0, right, 0);
@@ -3973,14 +4090,12 @@
     case MethodRecognizer::kFloat64x2WithY:
       __ vinsd(out, 1, right, 0);
       break;
-    case MethodRecognizer::kFloat64x2Min: {
-      UNIMPLEMENTED();
+    case MethodRecognizer::kFloat64x2Min:
+      __ vmind(out, left, right);
       break;
-    }
-    case MethodRecognizer::kFloat64x2Max: {
-      UNIMPLEMENTED();
+    case MethodRecognizer::kFloat64x2Max:
+      __ vmaxd(out, left, right);
       break;
-    }
     default: UNREACHABLE();
   }
 }
@@ -4392,7 +4507,7 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* result = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  result->set_in(0, Location::WritableRegister());
+  result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
 }
@@ -4401,8 +4516,8 @@
 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register value = locs()->in(0).reg();
   const VRegister result = locs()->out(0).fpu_reg();
-  __ SmiUntag(value);
-  __ scvtfd(result, value);
+  __ SmiUntag(TMP, value);
+  __ scvtfd(result, TMP);
 }
 
 
@@ -4771,8 +4886,8 @@
       __ b(deopt, EQ);
     }
 
-    __ Asr(result_mod, left, kSmiTagSize);  // SmiUntag left.
-    __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right.
+    __ SmiUntag(result_mod, left);
+    __ SmiUntag(TMP, right);
 
     __ sdiv(result_div, result_mod, TMP);
 
@@ -5154,7 +5269,8 @@
 
 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  return LocationSummary::Make(0,
+  return LocationSummary::Make(isolate,
+                               0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -5248,7 +5364,8 @@
 
 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
                                                          bool opt) const {
-  return LocationSummary::Make(1,
+  return LocationSummary::Make(isolate,
+                               1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -5273,7 +5390,7 @@
 
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls()));
-  const ExternalLabel label(cls().ToCString(), stub.EntryPoint());
+  const ExternalLabel label(stub.EntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
                          PcDescriptors::kOther,
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 039c7a4..5b6f8b8 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -107,7 +107,8 @@
   const intptr_t stack_index = (local().index() < 0)
       ? kFirstLocalSlotFromFp - local().index()
       : kParamEndSlotFromFp - local().index();
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::StackSlot(stack_index),
                                LocationSummary::kNoCall);
 }
@@ -122,7 +123,8 @@
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
@@ -139,7 +141,8 @@
 LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
                                                     bool opt) const {
   const intptr_t kNumInputs = 0;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -833,7 +836,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -854,7 +858,8 @@
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -907,7 +912,8 @@
 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -923,7 +929,8 @@
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -1111,11 +1118,11 @@
 
 
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register array = locs()->in(0).reg();
-  Location index = locs()->in(1);
+  // The array register points to the backing store for external arrays.
+  const Register array = locs()->in(0).reg();
+  const Location index = locs()->in(1);
 
-  Address element_address(kNoRegister, 0);
-  element_address = index.IsRegister()
+  Address element_address = index.IsRegister()
       ? ElementAddressForRegIndex(IsExternal(), class_id(), index_scale(),
                                   array, index.reg())
       : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
@@ -1336,11 +1343,11 @@
 
 
 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register array = locs()->in(0).reg();
-  Location index = locs()->in(1);
+  // The array register points to the backing store for external arrays.
+  const Register array = locs()->in(0).reg();
+  const Location index = locs()->in(1);
 
-  Address element_address(kNoRegister, 0);
-  element_address = index.IsRegister()
+  Address element_address = index.IsRegister()
       ? ElementAddressForRegIndex(IsExternal(), class_id(), index_scale(),
                                   array, index.reg())
       : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
@@ -1799,7 +1806,7 @@
     __ Bind(entry_label());
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(cls_));
-    const ExternalLabel label(cls_.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2288,7 +2295,7 @@
     const Class& double_class = compiler->double_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(double_class));
-    const ExternalLabel label(double_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2320,7 +2327,7 @@
     const Class& float32x4_class = compiler->float32x4_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class));
-    const ExternalLabel label(float32x4_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2352,7 +2359,7 @@
     const Class& float64x2_class = compiler->float64x2_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class));
-    const ExternalLabel label(float64x2_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2660,8 +2667,7 @@
     compiler->SaveLiveRegisters(locs);
 
     __ movl(EDX, Immediate(instruction_->num_context_variables()));
-    const ExternalLabel label("alloc_context",
-                              StubCode::AllocateContextEntryPoint());
+    const ExternalLabel label(StubCode::AllocateContextEntryPoint());
     compiler->GenerateCall(instruction_->token_pos(),
                            &label,
                            PcDescriptors::kOther,
@@ -2751,8 +2757,7 @@
   ASSERT(locs()->out(0).reg() == EAX);
 
   __ movl(EDX, Immediate(num_context_variables()));
-  const ExternalLabel label("alloc_context",
-                            StubCode::AllocateContextEntryPoint());
+  const ExternalLabel label(StubCode::AllocateContextEntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
                          PcDescriptors::kOther,
@@ -3696,7 +3701,7 @@
     const Class& int32x4_class = compiler->int32x4_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class));
-    const ExternalLabel label(int32x4_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -4927,7 +4932,8 @@
 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
@@ -5770,7 +5776,7 @@
         Class::ZoneHandle(Isolate::Current()->object_store()->mint_class());
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(mint_class));
-    const ExternalLabel label(mint_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -6133,7 +6139,8 @@
 
 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  return LocationSummary::Make(0,
+  return LocationSummary::Make(isolate,
+                               0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -6342,7 +6349,8 @@
 
 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
                                                          bool opt) const {
-  return LocationSummary::Make(1,
+  return LocationSummary::Make(isolate,
+                               1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -6369,7 +6377,7 @@
 
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls()));
-  const ExternalLabel label(cls().ToCString(), stub.EntryPoint());
+  const ExternalLabel label(stub.EntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
                          PcDescriptors::kOther,
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 5ac7ec4..e4213a7 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -261,7 +261,8 @@
 
 LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
                                                      bool opt) const {
-  return LocationSummary::Make(0,
+  return LocationSummary::Make(isolate,
+                               0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -276,7 +277,8 @@
 
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
-  return LocationSummary::Make(1,
+  return LocationSummary::Make(isolate,
+                               1,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
@@ -293,7 +295,8 @@
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
                                                     bool opt) const {
-  return LocationSummary::Make(0,
+  return LocationSummary::Make(isolate,
+                               0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -910,7 +913,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -934,7 +938,8 @@
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -988,7 +993,8 @@
 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -1004,7 +1010,8 @@
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -1098,6 +1105,22 @@
 }
 
 
+static bool CanBeImmediateIndex(Value* value, intptr_t cid, bool is_external) {
+  ConstantInstr* constant = value->definition()->AsConstant();
+  if ((constant == NULL) || !Assembler::IsSafeSmi(constant->value())) {
+    return false;
+  }
+  const int64_t index = Smi::Cast(constant->value()).AsInt64Value();
+  const intptr_t scale = Instance::ElementSizeFor(cid);
+  const int64_t offset = index * scale +
+      (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
+  if (!Utils::IsInt(32, offset)) {
+    return false;
+  }
+  return Address::CanHoldOffset(static_cast<int32_t>(offset));
+}
+
+
 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -1105,11 +1128,12 @@
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
-  // The smi index is either untagged (element size == 1), or it is left smi
-  // tagged (for all element sizes > 1).
-  // TODO(regis): Revisit and see if the index can be immediate.
-  locs->set_in(1, Location::WritableRegister());
-  if ((representation() == kUnboxedDouble) ||
+  if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
+    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+  } else {
+    locs->set_in(1, Location::RequiresRegister());
+  }
+  if ((representation() == kUnboxedDouble)    ||
       (representation() == kUnboxedFloat32x4) ||
       (representation() == kUnboxedInt32x4)) {
     locs->set_out(0, Location::RequiresFpuRegister());
@@ -1120,53 +1144,62 @@
 }
 
 
+static Address ElementAddressForIntIndex(bool is_external,
+                                         intptr_t cid,
+                                         intptr_t index_scale,
+                                         Register array,
+                                         intptr_t index) {
+  const int64_t offset = index * index_scale +
+      (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
+  ASSERT(Utils::IsInt(32, offset));
+  ASSERT(Address::CanHoldOffset(offset));
+  return Address(array, static_cast<int32_t>(offset));
+}
+
+
+static Address ElementAddressForRegIndex(Assembler* assembler,
+                                         bool is_load,
+                                         bool is_external,
+                                         intptr_t cid,
+                                         intptr_t index_scale,
+                                         Register array,
+                                         Register index) {
+  // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays.
+  const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift;
+  const int32_t offset =
+      is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag);
+  ASSERT(array != TMP);
+  ASSERT(index != TMP);
+  const Register base = is_load ? TMP : index;
+  if (shift < 0) {
+    ASSERT(shift == -1);
+    assembler->sra(TMP, index, 1);
+    assembler->addu(base, array, TMP);
+  } else if (shift == 0) {
+    assembler->addu(base, array, index);
+  } else {
+    assembler->sll(TMP, index, shift);
+    assembler->addu(base, array, TMP);
+  }
+  ASSERT(Address::CanHoldOffset(offset));
+  return Address(base, offset);
+}
+
+
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("LoadIndexedInstr");
-  Register array = locs()->in(0).reg();
-  Location index = locs()->in(1);
+  // The array register points to the backing store for external arrays.
+  const Register array = locs()->in(0).reg();
+  const Location index = locs()->in(1);
 
-  Address element_address(kNoRegister, 0);
-
-  ASSERT(index.IsRegister());  // TODO(regis): Revisit.
-  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
-  // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
-  // index is expected to be untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  switch (index_scale()) {
-    case 1: {
-      __ SmiUntag(index.reg());
-      break;
-    }
-    case 2: {
-      break;
-    }
-    case 4: {
-      __ sll(index.reg(), index.reg(), 1);
-      break;
-    }
-    case 8: {
-      __ sll(index.reg(), index.reg(), 2);
-      break;
-    }
-    case 16: {
-      __ sll(index.reg(), index.reg(), 3);
-      break;
-    }
-    default:
-      UNREACHABLE();
-  }
-  __ addu(index.reg(), array, index.reg());
-
-  if (IsExternal()) {
-    element_address = Address(index.reg(), 0);
-  } else {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    // If the data offset doesn't fit into the 18 bits we get for the addressing
-    // mode, then we must load the offset into a register and add it to the
-    // index.
-    element_address = Address(index.reg(),
-        Instance::DataOffsetFor(class_id()) - kHeapObjectTag);
-  }
+  Address element_address = index.IsRegister()
+      ? ElementAddressForRegIndex(compiler->assembler(),
+                                  true,  // Load.
+                                  IsExternal(), class_id(), index_scale(),
+                                  array, index.reg())
+      : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
+                                  array, Smi::Cast(index.constant()).Value());
+  // Warning: element_address may use register TMP as base.
 
   if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedMint) ||
@@ -1185,8 +1218,8 @@
         __ lwc1(EvenFRegisterOf(result), element_address);
         break;
       case kTypedDataFloat64ArrayCid:
-        __ LoadDFromOffset(result, index.reg(),
-            Instance::DataOffsetFor(class_id()) - kHeapObjectTag);
+        __ LoadDFromOffset(result,
+                           element_address.base(), element_address.offset());
         break;
       case kTypedDataInt32x4ArrayCid:
       case kTypedDataFloat32x4ArrayCid:
@@ -1196,7 +1229,7 @@
     return;
   }
 
-  Register result = locs()->out(0).reg();
+  const Register result = locs()->out(0).reg();
   switch (class_id()) {
     case kTypedDataInt8ArrayCid:
       ASSERT(index_scale() == 1);
@@ -1290,10 +1323,11 @@
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
-  // The smi index is either untagged (element size == 1), or it is left smi
-  // tagged (for all element sizes > 1).
-  // TODO(regis): Revisit and see if the index can be immediate.
-  locs->set_in(1, Location::WritableRegister());
+  if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
+    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+  } else {
+    locs->set_in(1, Location::WritableRegister());
+  }
   switch (class_id()) {
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
@@ -1310,13 +1344,9 @@
     case kTypedDataUint16ArrayCid:
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      locs->set_in(2, Location::WritableRegister());
+      locs->set_in(2, Location::RequiresRegister());
       break;
     case kTypedDataFloat32ArrayCid:
-      // TODO(regis): Verify.
-      // Need temp register for float-to-double conversion.
-      locs->AddTemp(Location::RequiresFpuRegister());
-      // Fall through.
     case kTypedDataFloat64ArrayCid:  // TODO(srdjan): Support Float64 constants.
     case kTypedDataInt32x4ArrayCid:
     case kTypedDataFloat32x4ArrayCid:
@@ -1332,47 +1362,17 @@
 
 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("StoreIndexedInstr");
-  Register array = locs()->in(0).reg();
-  Location index = locs()->in(1);
+  // The array register points to the backing store for external arrays.
+  const Register array = locs()->in(0).reg();
+  const Location index = locs()->in(1);
 
-  Address element_address(kNoRegister, 0);
-  ASSERT(index.IsRegister());  // TODO(regis): Revisit.
-  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
-  // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
-  // index is expected to be untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  switch (index_scale()) {
-    case 1: {
-      __ SmiUntag(index.reg());
-      break;
-    }
-    case 2: {
-      break;
-    }
-    case 4: {
-      __ sll(index.reg(), index.reg(), 1);
-      break;
-    }
-    case 8: {
-      __ sll(index.reg(), index.reg(), 2);
-      break;
-    }
-    case 16: {
-      __ sll(index.reg(), index.reg(), 3);
-      break;
-    }
-    default:
-      UNREACHABLE();
-  }
-  __ addu(index.reg(), array, index.reg());
-
-  if (IsExternal()) {
-    element_address = Address(index.reg(), 0);
-  } else {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    element_address = Address(index.reg(),
-        Instance::DataOffsetFor(class_id()) - kHeapObjectTag);
-  }
+  Address element_address = index.IsRegister()
+      ? ElementAddressForRegIndex(compiler->assembler(),
+                                  false,  // Store.
+                                  IsExternal(), class_id(), index_scale(),
+                                  array, index.reg())
+      : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
+                                  array, Smi::Cast(index.constant()).Value());
 
   switch (class_id()) {
     case kArrayCid:
@@ -1397,8 +1397,8 @@
         __ sb(TMP, element_address);
       } else {
         Register value = locs()->in(2).reg();
-        __ SmiUntag(value);
-        __ sb(value, element_address);
+        __ SmiUntag(TMP, value);
+        __ sb(TMP, element_address);
       }
       break;
     }
@@ -1418,22 +1418,21 @@
       } else {
         Register value = locs()->in(2).reg();
         Label store_value, bigger, smaller;
-        __ SmiUntag(value);
-        __ BranchUnsignedLess(value, 0xFF + 1, &store_value);
+        __ SmiUntag(TMP, value);
+        __ BranchUnsignedLess(TMP, 0xFF + 1, &store_value);
         __ LoadImmediate(TMP, 0xFF);
         __ slti(CMPRES1, value, Immediate(1));
         __ movn(TMP, ZR, CMPRES1);
-        __ mov(value, TMP);
         __ Bind(&store_value);
-        __ sb(value, element_address);
+        __ sb(TMP, element_address);
       }
       break;
     }
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid: {
       Register value = locs()->in(2).reg();
-      __ SmiUntag(value);
-      __ sh(value, element_address);
+      __ SmiUntag(TMP, value);
+      __ sh(TMP, element_address);
       break;
     }
     case kTypedDataInt32ArrayCid:
@@ -1441,8 +1440,8 @@
       if (value()->IsSmiValue()) {
         ASSERT(RequiredInputRepresentation(2) == kTagged);
         Register value = locs()->in(2).reg();
-        __ SmiUntag(value);
-        __ sw(value, element_address);
+        __ SmiUntag(TMP, value);
+        __ sw(TMP, element_address);
       } else {
         UNIMPLEMENTED();
       }
@@ -1454,8 +1453,8 @@
       break;
     }
     case kTypedDataFloat64ArrayCid:
-      __ StoreDToOffset(locs()->in(2).fpu_reg(), index.reg(),
-          Instance::DataOffsetFor(class_id()) - kHeapObjectTag);
+      __ StoreDToOffset(locs()->in(2).fpu_reg(),
+                        element_address.base(), element_address.offset());
       break;
     case kTypedDataInt32x4ArrayCid:
     case kTypedDataFloat32x4ArrayCid:
@@ -1807,7 +1806,7 @@
     __ Bind(entry_label());
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(cls_));
-    const ExternalLabel label(cls_.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2213,7 +2212,7 @@
     const Class& double_class = compiler->double_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(double_class));
-    const ExternalLabel label(double_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2464,8 +2463,7 @@
 
   __ TraceSimMsg("AllocateContextInstr");
   __ LoadImmediate(temp, num_context_variables());
-  const ExternalLabel label("alloc_context",
-                            StubCode::AllocateContextEntryPoint());
+  const ExternalLabel label(StubCode::AllocateContextEntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
                          PcDescriptors::kOther,
@@ -2705,7 +2703,7 @@
         __ BranchUnsignedGreaterEqual(
             right, reinterpret_cast<int32_t>(Smi::New(max_right)), deopt);
       }
-      __ sra(TMP, right, kSmiTagMask);  // SmiUntag right into TMP.
+      __ SmiUntag(TMP, right);
       __ sllv(result, left, TMP);
     }
     return;
@@ -2744,7 +2742,7 @@
     // Left is not a constant.
     Register temp = locs.temp(0).reg();
     // Check if count too large for handling it inlined.
-    __ sra(temp, right, kSmiTagSize);  // SmiUntag right into temp.
+    __ SmiUntag(temp, right);
     // Overflow test (preserve left, right, and temp);
     __ sllv(CMPRES1, left, temp);
     __ srav(CMPRES1, CMPRES1, temp);
@@ -3015,8 +3013,8 @@
         __ beq(right, ZR, deopt);
       }
       Register temp = locs()->temp(0).reg();
-      __ sra(temp, left, kSmiTagSize);  // SmiUntag left into temp.
-      __ sra(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+      __ SmiUntag(temp, left);
+      __ SmiUntag(TMP, right);
       __ div(temp, TMP);
       __ mflo(result);
       // Check the corner case of dividing the 'MIN_SMI' with -1, in which
@@ -3031,8 +3029,8 @@
         __ beq(right, ZR, deopt);
       }
       Register temp = locs()->temp(0).reg();
-      __ sra(temp, left, kSmiTagSize);  // SmiUntag left into temp.
-      __ sra(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+      __ SmiUntag(temp, left);
+      __ SmiUntag(TMP, right);
       __ div(temp, TMP);
       __ mfhi(result);
       //  res = left % right;
@@ -3068,7 +3066,7 @@
       if (CanDeoptimize()) {
         __ bltz(right, deopt);
       }
-      __ sra(temp, right, kSmiTagSize);  // SmiUntag right into temp.
+      __ SmiUntag(temp, right);
       // sra operation masks the count to 5 bits.
       const intptr_t kCountLimit = 0x1F;
       if ((right_range == NULL) ||
@@ -3079,7 +3077,7 @@
         __ Bind(&ok);
       }
 
-      __ sra(CMPRES1, left, kSmiTagSize);  // SmiUntag left into CMPRES1.
+      __ SmiUntag(CMPRES1, left);
       __ srav(result, CMPRES1, temp);
       __ SmiTag(result);
       break;
@@ -3174,14 +3172,10 @@
 LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const bool needs_writable_input = (value_cid == kSmiCid);
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, needs_writable_input
-                     ? Location::WritableRegister()
-                     : Location::RequiresRegister());
+  summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -3196,8 +3190,8 @@
   if (value_cid == kDoubleCid) {
     __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag);
   } else if (value_cid == kSmiCid) {
-    __ SmiUntag(value);  // Untag input before conversion.
-    __ mtc1(value, STMP1);
+    __ SmiUntag(TMP, value);
+    __ mtc1(TMP, STMP1);
     __ cvtdw(result, STMP1);
   } else {
     Label* deopt = compiler->AddDeoptStub(deopt_id_,
@@ -3219,8 +3213,7 @@
           Double::value_offset() - kHeapObjectTag);
       __ b(&done);
       __ Bind(&is_smi);
-      // TODO(regis): Why do we preserve value here but not above?
-      __ sra(TMP, value, 1);
+      __ SmiUntag(TMP, value);
       __ mtc1(TMP, STMP1);
       __ cvtdw(result, STMP1);
       __ Bind(&done);
@@ -3883,7 +3876,7 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* result = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  result->set_in(0, Location::WritableRegister());
+  result->set_in(0, Location::RequiresRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
 }
@@ -3892,8 +3885,8 @@
 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
   FpuRegister result = locs()->out(0).fpu_reg();
-  __ SmiUntag(value);
-  __ mtc1(value, STMP1);
+  __ SmiUntag(TMP, value);
+  __ mtc1(TMP, STMP1);
   __ cvtdw(result, STMP1);
 }
 
@@ -4251,8 +4244,8 @@
       // Handle divide by zero in runtime.
       __ beq(right, ZR, deopt);
     }
-    __ sra(temp, left, kSmiTagSize);  // SmiUntag left into temp.
-    __ sra(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+    __ SmiUntag(temp, left);
+    __ SmiUntag(TMP, right);
     __ div(temp, TMP);
     __ mflo(result_div);
     __ mfhi(result_mod);
@@ -4629,7 +4622,8 @@
 
 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  return LocationSummary::Make(0,
+  return LocationSummary::Make(isolate,
+                               0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -4725,7 +4719,8 @@
 
 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
                                                          bool opt) const {
-  return LocationSummary::Make(1,
+  return LocationSummary::Make(isolate,
+                               1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -4752,7 +4747,7 @@
   __ TraceSimMsg("AllocateObjectInstr");
   __ Comment("AllocateObjectInstr");
   const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls()));
-  const ExternalLabel label(cls().ToCString(), stub.EntryPoint());
+  const ExternalLabel label(stub.EntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
                          PcDescriptors::kOther,
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index d3fda6d..0e2102e 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -189,7 +189,8 @@
   const intptr_t stack_index = (local().index() < 0)
       ? kFirstLocalSlotFromFp - local().index()
       : kParamEndSlotFromFp - local().index();
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::StackSlot(stack_index),
                                LocationSummary::kNoCall);
 }
@@ -204,7 +205,8 @@
 LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
@@ -221,7 +223,8 @@
 LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
                                                     bool opt) const {
   const intptr_t kNumInputs = 0;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -762,7 +765,8 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -783,7 +787,8 @@
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -836,7 +841,8 @@
 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -852,7 +858,8 @@
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -1024,11 +1031,11 @@
 
 
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register array = locs()->in(0).reg();
-  Location index = locs()->in(1);
+  // The array register points to the backing store for external arrays.
+  const Register array = locs()->in(0).reg();
+  const Location index = locs()->in(1);
 
-  Address element_address(kNoRegister, 0);
-  element_address = index.IsRegister()
+  Address element_address = index.IsRegister()
       ? ElementAddressForRegIndex(IsExternal(), class_id(), index_scale(),
                                   array, index.reg())
       : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
@@ -1195,11 +1202,11 @@
 
 
 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register array = locs()->in(0).reg();
-  Location index = locs()->in(1);
+  // The array register points to the backing store for external arrays.
+  const Register array = locs()->in(0).reg();
+  const Location index = locs()->in(1);
 
-  Address element_address(kNoRegister, 0);
-  element_address = index.IsRegister()
+  Address element_address = index.IsRegister()
       ? ElementAddressForRegIndex(IsExternal(), class_id(), index_scale(),
                                   array, index.reg())
       : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
@@ -1649,7 +1656,7 @@
     __ Bind(entry_label());
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(cls_));
-    const ExternalLabel label(cls_.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2132,7 +2139,7 @@
     const Class& double_class = compiler->double_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(double_class));
-    const ExternalLabel label(double_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2164,7 +2171,7 @@
     const Class& float32x4_class = compiler->float32x4_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class));
-    const ExternalLabel label(float32x4_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2196,7 +2203,7 @@
     const Class& float64x2_class = compiler->float64x2_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class));
-    const ExternalLabel label(float64x2_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -2482,8 +2489,7 @@
   ASSERT(locs()->out(0).reg() == RAX);
 
   __ LoadImmediate(R10, Immediate(num_context_variables()), PP);
-  const ExternalLabel label("alloc_context",
-                            StubCode::AllocateContextEntryPoint());
+  const ExternalLabel label(StubCode::AllocateContextEntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
                          PcDescriptors::kOther,
@@ -3419,7 +3425,8 @@
 LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::RequiresFpuRegister(),
                                LocationSummary::kNoCall);
 }
@@ -3526,7 +3533,7 @@
     const Class& int32x4_class = compiler->int32x4_class();
     const Code& stub =
         Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class));
-    const ExternalLabel label(int32x4_class.ToCString(), stub.EntryPoint());
+    const ExternalLabel label(stub.EntryPoint());
 
     LocationSummary* locs = instruction_->locs();
     locs->live_registers()->Remove(locs->out(0));
@@ -4679,7 +4686,8 @@
 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(kNumInputs,
+  return LocationSummary::Make(isolate,
+                               kNumInputs,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
 }
@@ -5733,7 +5741,8 @@
 
 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  return LocationSummary::Make(0,
+  return LocationSummary::Make(isolate,
+                               0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -5879,7 +5888,8 @@
 
 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
                                                          bool opt) const {
-  return LocationSummary::Make(1,
+  return LocationSummary::Make(isolate,
+                               1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
 }
@@ -5906,7 +5916,7 @@
 
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls()));
-  const ExternalLabel label(cls().ToCString(), stub.EntryPoint());
+  const ExternalLabel label(stub.EntryPoint());
   compiler->GenerateCall(token_pos(),
                          &label,
                          PcDescriptors::kOther,
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 9480bfd..f523d9f 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -40,16 +40,16 @@
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index
   __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array
 
-  __ tst(R0, ShifterOperand(kSmiTagMask));
+  __ tst(R0, Operand(kSmiTagMask));
   __ b(&fall_through, NE);  // Index is not an smi, fall through
 
   // range check
   __ ldr(R6, FieldAddress(R1, Array::length_offset()));
-  __ cmp(R0, ShifterOperand(R6));
+  __ cmp(R0, Operand(R6));
 
   ASSERT(kSmiTagShift == 1);
   // array element at R1 + R0*2 + Array::data_offset - 1
-  __ add(R6, R1, ShifterOperand(R0, LSL, 1), CC);
+  __ add(R6, R1, Operand(R0, LSL, 1), CC);
   __ ldr(R0, FieldAddress(R6, Array::data_offset()), CC);
   __ bx(LR, CC);
   __ Bind(&fall_through);
@@ -104,7 +104,7 @@
     __ b(&checked_ok, EQ);
 
     // Check for int and num.
-    __ tst(R2, ShifterOperand(kSmiTagMask));  // Value is Smi?
+    __ tst(R2, Operand(kSmiTagMask));  // Value is Smi?
     __ b(&fall_through, NE);  // Non-smi value.
     __ CompareObject(R0, Type::ZoneHandle(Type::IntType()));
     __ b(&checked_ok, EQ);
@@ -113,24 +113,22 @@
     __ Bind(&checked_ok);
   }
   __ ldr(R1, Address(SP, 1 * kWordSize));  // Index.
-  __ tst(R1, ShifterOperand(kSmiTagMask));
+  __ tst(R1, Operand(kSmiTagMask));
   // Index not Smi.
   __ b(&fall_through, NE);
   __ ldr(R0, Address(SP, 2 * kWordSize));  // Array.
 
   // Range check.
   __ ldr(R3, FieldAddress(R0, Array::length_offset()));  // Array length.
-  __ cmp(R1, ShifterOperand(R3));
+  __ cmp(R1, Operand(R3));
   // Runtime throws exception.
   __ b(&fall_through, CS);
 
   // Note that R1 is Smi, i.e, times 2.
   ASSERT(kSmiTagShift == 1);
   __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
-  __ add(R1, R0, ShifterOperand(R1, LSL, 1));  // R1 is Smi.
-  __ StoreIntoObject(R0,
-                     FieldAddress(R1, Array::data_offset()),
-                     R2);
+  __ add(R1, R0, Operand(R1, LSL, 1));  // R1 is Smi.
+  __ StoreIntoObject(R0, FieldAddress(R1, Array::data_offset()), R2);
   // Caller is responsible for preserving the value if necessary.
   __ Ret();
   __ Bind(&fall_through);
@@ -162,7 +160,7 @@
   // R1: potential next object start.
   __ LoadImmediate(R3, heap->EndAddress());
   __ ldr(R3, Address(R3, 0));
-  __ cmp(R1, ShifterOperand(R3));
+  __ cmp(R1, Operand(R3));
   __ b(&fall_through, CS);
 
   // Successfully allocated the object(s), now update top to point to
@@ -227,17 +225,17 @@
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index
   __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array
 
-  __ tst(R0, ShifterOperand(kSmiTagMask));
+  __ tst(R0, Operand(kSmiTagMask));
   __ b(&fall_through, NE);  // Index is not an smi, fall through
 
   // range check
   __ ldr(R6, FieldAddress(R1, GrowableObjectArray::length_offset()));
-  __ cmp(R0, ShifterOperand(R6));
+  __ cmp(R0, Operand(R6));
 
   ASSERT(kSmiTagShift == 1);
   // array element at R6 + R0 * 2 + Array::data_offset - 1
   __ ldr(R6, FieldAddress(R1, GrowableObjectArray::data_offset()), CC);  // data
-  __ add(R6, R6, ShifterOperand(R0, LSL, 1), CC);
+  __ add(R6, R6, Operand(R0, LSL, 1), CC);
   __ ldr(R0, FieldAddress(R6, Array::data_offset()), CC);
   __ bx(LR, CC);
   __ Bind(&fall_through);
@@ -253,21 +251,19 @@
   Label fall_through;
   __ ldr(R1, Address(SP, 1 * kWordSize));  // Index.
   __ ldr(R0, Address(SP, 2 * kWordSize));  // GrowableArray.
-  __ tst(R1, ShifterOperand(kSmiTagMask));
+  __ tst(R1, Operand(kSmiTagMask));
   __ b(&fall_through, NE);  // Non-smi index.
   // Range check using _length field.
   __ ldr(R2, FieldAddress(R0, GrowableObjectArray::length_offset()));
-  __ cmp(R1, ShifterOperand(R2));
+  __ cmp(R1, Operand(R2));
   // Runtime throws exception.
   __ b(&fall_through, CS);
   __ ldr(R0, FieldAddress(R0, GrowableObjectArray::data_offset()));  // data.
   __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
   // Note that R1 is Smi, i.e, times 2.
   ASSERT(kSmiTagShift == 1);
-  __ add(R1, R0, ShifterOperand(R1, LSL, 1));
-  __ StoreIntoObject(R0,
-                     FieldAddress(R1, Array::data_offset()),
-                     R2);
+  __ add(R1, R0, Operand(R1, LSL, 1));
+  __ StoreIntoObject(R0, FieldAddress(R1, Array::data_offset()), R2);
   __ Ret();
   __ Bind(&fall_through);
 }
@@ -279,7 +275,7 @@
 void Intrinsifier::GrowableList_setLength(Assembler* assembler) {
   __ ldr(R0, Address(SP, 1 * kWordSize));  // Growable array.
   __ ldr(R1, Address(SP, 0 * kWordSize));  // Length value.
-  __ tst(R1, ShifterOperand(kSmiTagMask));  // Check for Smi.
+  __ tst(R1, Operand(kSmiTagMask));  // Check for Smi.
   __ str(R1, FieldAddress(R0, GrowableObjectArray::length_offset()), EQ);
   __ bx(LR, EQ);
   // Fall through on non-Smi.
@@ -295,7 +291,7 @@
   Label fall_through;
   __ ldr(R1, Address(SP, 0 * kWordSize));  // Data.
   // Check that data is an ObjectArray.
-  __ tst(R1, ShifterOperand(kSmiTagMask));
+  __ tst(R1, Operand(kSmiTagMask));
   __ b(&fall_through, EQ);  // Data is Smi.
   __ CompareClassId(R1, kArrayCid, R0);
   __ b(&fall_through, NE);
@@ -326,18 +322,16 @@
   // R3: capacity.
   __ ldr(R3, FieldAddress(R2, Array::length_offset()));
   // Compare length with capacity.
-  __ cmp(R1, ShifterOperand(R3));
+  __ cmp(R1, Operand(R3));
   __ b(&fall_through, EQ);  // Must grow data.
   const int32_t value_one = reinterpret_cast<int32_t>(Smi::New(1));
   // len = len + 1;
-  __ add(R3, R1, ShifterOperand(value_one));
+  __ add(R3, R1, Operand(value_one));
   __ str(R3, FieldAddress(R0, GrowableObjectArray::length_offset()));
   __ ldr(R0, Address(SP, 0 * kWordSize));  // Value.
   ASSERT(kSmiTagShift == 1);
-  __ add(R1, R2, ShifterOperand(R1, LSL, 1));
-  __ StoreIntoObject(R2,
-                     FieldAddress(R1, Array::data_offset()),
-                     R0);
+  __ add(R1, R2, Operand(R1, LSL, 1));
+  __ StoreIntoObject(R2, FieldAddress(R1, Array::data_offset()), R0);
   const int32_t raw_null = reinterpret_cast<int32_t>(Object::null());
   __ LoadImmediate(R0, raw_null);
   __ Ret();
@@ -351,7 +345,7 @@
   __ ldr(R2, Address(SP, kArrayLengthStackOffset));  /* Array length. */       \
   /* Check that length is a positive Smi. */                                   \
   /* R2: requested array length argument. */                                   \
-  __ tst(R2, ShifterOperand(kSmiTagMask));                                     \
+  __ tst(R2, Operand(kSmiTagMask));                                            \
   __ b(&fall_through, NE);                                                     \
   __ CompareImmediate(R2, 0);                                                  \
   __ b(&fall_through, LT);                                                     \
@@ -360,17 +354,17 @@
   /* R2: untagged array length. */                                             \
   __ CompareImmediate(R2, max_len);                                            \
   __ b(&fall_through, GT);                                                     \
-  __ mov(R2, ShifterOperand(R2, LSL, scale_shift));                            \
+  __ mov(R2, Operand(R2, LSL, scale_shift));                                   \
   const intptr_t fixed_size = sizeof(Raw##type_name) + kObjectAlignment - 1;   \
   __ AddImmediate(R2, fixed_size);                                             \
-  __ bic(R2, R2, ShifterOperand(kObjectAlignment - 1));                        \
+  __ bic(R2, R2, Operand(kObjectAlignment - 1));                               \
   Heap* heap = Isolate::Current()->heap();                                     \
                                                                                \
   __ LoadImmediate(R0, heap->TopAddress());                                    \
   __ ldr(R0, Address(R0, 0));                                                  \
                                                                                \
   /* R2: allocation size. */                                                   \
-  __ add(R1, R0, ShifterOperand(R2));                                          \
+  __ add(R1, R0, Operand(R2));                                                 \
   __ b(&fall_through, VS);                                                     \
                                                                                \
   /* Check if the allocation fits into the remaining space. */                 \
@@ -379,7 +373,7 @@
   /* R2: allocation size. */                                                   \
   __ LoadImmediate(R3, heap->EndAddress());                                    \
   __ ldr(R3, Address(R3, 0));                                                  \
-  __ cmp(R1, ShifterOperand(R3));                                              \
+  __ cmp(R1, Operand(R3));                                                     \
   __ b(&fall_through, CS);                                                     \
                                                                                \
   /* Successfully allocated the object(s), now update top to point to */       \
@@ -394,13 +388,13 @@
   /* R2: allocation size. */                                                   \
   {                                                                            \
     __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag);                  \
-    __ mov(R2, ShifterOperand(R2, LSL,                                         \
+    __ mov(R2, Operand(R2, LSL,                                                \
         RawObject::kSizeTagPos - kObjectAlignmentLog2), LS);                   \
-    __ mov(R2, ShifterOperand(0), HI);                                         \
+    __ mov(R2, Operand(0), HI);                                                \
                                                                                \
     /* Get the class index and insert it into the tags. */                     \
     __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid));                 \
-    __ orr(R2, R2, ShifterOperand(TMP));                                       \
+    __ orr(R2, R2, Operand(TMP));                                              \
     __ str(R2, FieldAddress(R0, type_name::tags_offset()));  /* Tags. */       \
   }                                                                            \
   /* Set the length field. */                                                  \
@@ -420,9 +414,9 @@
   __ AddImmediate(R2, R0, sizeof(Raw##type_name) - 1);                         \
   Label init_loop;                                                             \
   __ Bind(&init_loop);                                                         \
-  __ cmp(R2, ShifterOperand(R1));                                              \
+  __ cmp(R2, Operand(R1));                                                     \
   __ str(R3, Address(R2, 0), CC);                                              \
-  __ add(R2, R2, ShifterOperand(kWordSize), CC);                               \
+  __ add(R2, R2, Operand(kWordSize), CC);                                      \
   __ b(&init_loop, CC);                                                        \
                                                                                \
   __ Ret();                                                                    \
@@ -472,8 +466,8 @@
 static void TestBothArgumentsSmis(Assembler* assembler, Label* not_smi) {
   __ ldr(R0, Address(SP, + 0 * kWordSize));
   __ ldr(R1, Address(SP, + 1 * kWordSize));
-  __ orr(TMP, R0, ShifterOperand(R1));
-  __ tst(TMP, ShifterOperand(kSmiTagMask));
+  __ orr(TMP, R0, Operand(R1));
+  __ tst(TMP, Operand(kSmiTagMask));
   __ b(not_smi, NE);
   return;
 }
@@ -482,7 +476,7 @@
 void Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);  // Checks two smis.
-  __ adds(R0, R0, ShifterOperand(R1));  // Adds.
+  __ adds(R0, R0, Operand(R1));  // Adds.
   __ bx(LR, VC);  // Return if no overflow.
   // Otherwise fall through.
   __ Bind(&fall_through);
@@ -497,7 +491,7 @@
 void Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ subs(R0, R0, ShifterOperand(R1));  // Subtract.
+  __ subs(R0, R0, Operand(R1));  // Subtract.
   __ bx(LR, VC);  // Return if no overflow.
   // Otherwise fall through.
   __ Bind(&fall_through);
@@ -507,7 +501,7 @@
 void Intrinsifier::Integer_sub(Assembler* assembler) {
   Label fall_through;
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ subs(R0, R1, ShifterOperand(R0));  // Subtract.
+  __ subs(R0, R1, Operand(R0));  // Subtract.
   __ bx(LR, VC);  // Return if no overflow.
   // Otherwise fall through.
   __ Bind(&fall_through);
@@ -522,7 +516,7 @@
 
   if (TargetCPUFeatures::arm_version() == ARMv7) {
     __ smull(R0, IP, R0, R1);  // IP:R0 <- R0 * R1.
-    __ cmp(IP, ShifterOperand(R0, ASR, 31));
+    __ cmp(IP, Operand(R0, ASR, 31));
     __ bx(LR, EQ);
   } else {
     __ CheckMultSignedOverflow(R0, R1, IP, D0, D1, &fall_through);
@@ -558,20 +552,20 @@
   ASSERT(left == result);
 
   // Check for quick zero results.
-  __ cmp(left, ShifterOperand(0));
-  __ mov(R0, ShifterOperand(0), EQ);
+  __ cmp(left, Operand(0));
+  __ mov(R0, Operand(0), EQ);
   __ bx(LR, EQ);  // left is 0? Return 0.
-  __ cmp(left, ShifterOperand(right));
-  __ mov(R0, ShifterOperand(0), EQ);
+  __ cmp(left, Operand(right));
+  __ mov(R0, Operand(0), EQ);
   __ bx(LR, EQ);  // left == right? Return 0.
 
   // Check if result should be left.
-  __ cmp(left, ShifterOperand(0));
+  __ cmp(left, Operand(0));
   __ b(&modulo, LT);
   // left is positive.
-  __ cmp(left, ShifterOperand(right));
+  __ cmp(left, Operand(right));
   // left is less than right, result is left.
-  __ mov(R0, ShifterOperand(left), LT);
+  __ mov(R0, Operand(left), LT);
   __ bx(LR, LT);
 
   __ Bind(&modulo);
@@ -600,25 +594,25 @@
   Label fall_through;
   __ ldr(R1, Address(SP, + 0 * kWordSize));
   __ ldr(R0, Address(SP, + 1 * kWordSize));
-  __ orr(TMP, R0, ShifterOperand(R1));
-  __ tst(TMP, ShifterOperand(kSmiTagMask));
+  __ orr(TMP, R0, Operand(R1));
+  __ tst(TMP, Operand(kSmiTagMask));
   __ b(&fall_through, NE);
   // R1: Tagged left (dividend).
   // R0: Tagged right (divisor).
   // Check if modulo by zero -> exception thrown in main function.
-  __ cmp(R0, ShifterOperand(0));
+  __ cmp(R0, Operand(0));
   __ b(&fall_through, EQ);
   EmitRemainderOperation(assembler);
   // Untagged right in R0. Untagged remainder result in R1.
 
-  __ cmp(R1, ShifterOperand(0));
-  __ mov(R0, ShifterOperand(R1, LSL, 1), GE);  // Tag and move result to R0.
+  __ cmp(R1, Operand(0));
+  __ mov(R0, Operand(R1, LSL, 1), GE);  // Tag and move result to R0.
   __ bx(LR, GE);
 
   // Result is negative, adjust it.
-  __ cmp(R0, ShifterOperand(0));
-  __ sub(R0, R1, ShifterOperand(R0), LT);
-  __ add(R0, R1, ShifterOperand(R0), GE);
+  __ cmp(R0, Operand(0));
+  __ sub(R0, R1, Operand(R0), LT);
+  __ add(R0, R1, Operand(R0), GE);
   __ SmiTag(R0);
   __ Ret();
 
@@ -631,7 +625,7 @@
   Label fall_through;
 
   TestBothArgumentsSmis(assembler, &fall_through);
-  __ cmp(R0, ShifterOperand(0));
+  __ cmp(R0, Operand(0));
   __ b(&fall_through, EQ);  // If b is 0, fall through.
 
   __ SmiUntag(R0);
@@ -651,9 +645,9 @@
 void Intrinsifier::Integer_negate(Assembler* assembler) {
   Label fall_through;
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Grab first argument.
-  __ tst(R0, ShifterOperand(kSmiTagMask));  // Test for Smi.
+  __ tst(R0, Operand(kSmiTagMask));  // Test for Smi.
   __ b(&fall_through, NE);
-  __ rsbs(R0, R0, ShifterOperand(0));  // R0 is a Smi. R0 <- 0 - R0.
+  __ rsbs(R0, R0, Operand(0));  // R0 is a Smi. R0 <- 0 - R0.
   __ bx(LR, VC);  // Return if there wasn't overflow, fall through otherwise.
   // R0 is not a Smi. Fall through.
   __ Bind(&fall_through);
@@ -664,7 +658,7 @@
   Label fall_through;
 
   TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
-  __ and_(R0, R0, ShifterOperand(R1));
+  __ and_(R0, R0, Operand(R1));
 
   __ Ret();
   __ Bind(&fall_through);
@@ -680,7 +674,7 @@
   Label fall_through;
 
   TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
-  __ orr(R0, R0, ShifterOperand(R1));
+  __ orr(R0, R0, Operand(R1));
 
   __ Ret();
   __ Bind(&fall_through);
@@ -696,7 +690,7 @@
   Label fall_through;
 
   TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
-  __ eor(R0, R0, ShifterOperand(R1));
+  __ eor(R0, R0, Operand(R1));
 
   __ Ret();
   __ Bind(&fall_through);
@@ -721,11 +715,11 @@
 
   // Check for overflow by shifting left and shifting back arithmetically.
   // If the result is different from the original, there was overflow.
-  __ mov(IP, ShifterOperand(R1, LSL, R0));
-  __ cmp(R1, ShifterOperand(IP, ASR, R0));
+  __ mov(IP, Operand(R1, LSL, R0));
+  __ cmp(R1, Operand(IP, ASR, R0));
 
   // No overflow, result in R0.
-  __ mov(R0, ShifterOperand(R1, LSL, R0), EQ);
+  __ mov(R0, Operand(R1, LSL, R0), EQ);
   __ bx(LR, EQ);
 
   // Arguments are Smi but the shift produced an overflow to Mint.
@@ -738,14 +732,14 @@
   // high bits = (((1 << R0) - 1) << (32 - R0)) & R1) >> (32 - R0)
   // lo bits = R1 << R0
   __ LoadImmediate(R7, 1);
-  __ mov(R7, ShifterOperand(R7, LSL, R0));  // R7 <- 1 << R0
-  __ sub(R7, R7, ShifterOperand(1));  // R7 <- R7 - 1
-  __ rsb(R8, R0, ShifterOperand(32));  // R8 <- 32 - R0
-  __ mov(R7, ShifterOperand(R7, LSL, R8));  // R7 <- R7 << R8
-  __ and_(R7, R1, ShifterOperand(R7));  // R7 <- R7 & R1
-  __ mov(R7, ShifterOperand(R7, LSR, R8));  // R7 <- R7 >> R8
+  __ mov(R7, Operand(R7, LSL, R0));  // R7 <- 1 << R0
+  __ sub(R7, R7, Operand(1));  // R7 <- R7 - 1
+  __ rsb(R8, R0, Operand(32));  // R8 <- 32 - R0
+  __ mov(R7, Operand(R7, LSL, R8));  // R7 <- R7 << R8
+  __ and_(R7, R1, Operand(R7));  // R7 <- R7 & R1
+  __ mov(R7, Operand(R7, LSR, R8));  // R7 <- R7 >> R8
   // Now R7 has the bits that fall off of R1 on a left shift.
-  __ mov(R1, ShifterOperand(R1, LSL, R0));  // R1 gets the low bits.
+  __ mov(R1, Operand(R1, LSL, R0));  // R1 gets the low bits.
 
   const Class& mint_class = Class::Handle(
       Isolate::Current()->object_store()->mint_class());
@@ -765,13 +759,13 @@
                            Register reg,
                            Label* not_smi_or_mint) {
   Label not_smi, done;
-  __ tst(reg, ShifterOperand(kSmiTagMask));
+  __ tst(reg, Operand(kSmiTagMask));
   __ b(&not_smi, NE);
   __ SmiUntag(reg);
 
   // Sign extend to 64 bit
-  __ mov(res_lo, ShifterOperand(reg));
-  __ mov(res_hi, ShifterOperand(res_lo, ASR, 31));
+  __ mov(res_lo, Operand(reg));
+  __ mov(res_hi, Operand(res_lo, ASR, 31));
   __ b(&done);
 
   __ Bind(&not_smi);
@@ -791,7 +785,7 @@
   TestBothArgumentsSmis(assembler, &try_mint_smi);
   // R0 contains the right argument. R1 contains left argument
 
-  __ cmp(R1, ShifterOperand(R0));
+  __ cmp(R1, Operand(R0));
   __ b(&is_true, true_condition);
   __ Bind(&is_false);
   __ LoadObject(R0, Bool::False());
@@ -830,10 +824,10 @@
   // R7: right high.
   // R6: right low.
 
-  __ cmp(R3, ShifterOperand(R7));  // Compare left hi, right high.
+  __ cmp(R3, Operand(R7));  // Compare left hi, right high.
   __ b(&is_false, hi_false_cond);
   __ b(&is_true, hi_true_cond);
-  __ cmp(R2, ShifterOperand(R6));  // Compare left lo, right lo.
+  __ cmp(R2, Operand(R6));  // Compare left lo, right lo.
   __ b(&is_false, lo_false_cond);
   // Else is true.
   __ b(&is_true);
@@ -874,11 +868,11 @@
   // For integer receiver '===' check first.
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R1, Address(SP, 1 * kWordSize));
-  __ cmp(R0, ShifterOperand(R1));
+  __ cmp(R0, Operand(R1));
   __ b(&true_label, EQ);
 
-  __ orr(R2, R0, ShifterOperand(R1));
-  __ tst(R2, ShifterOperand(kSmiTagMask));
+  __ orr(R2, R0, Operand(R1));
+  __ tst(R2, Operand(kSmiTagMask));
   __ b(&check_for_mint, NE);  // If R0 or R1 is not a smi do Mint checks.
 
   // Both arguments are smi, '===' is good enough.
@@ -892,7 +886,7 @@
   Label receiver_not_smi;
   __ Bind(&check_for_mint);
 
-  __ tst(R1, ShifterOperand(kSmiTagMask));  // Check receiver.
+  __ tst(R1, Operand(kSmiTagMask));  // Check receiver.
   __ b(&receiver_not_smi, NE);
 
   // Left (receiver) is Smi, return false if right is not Double.
@@ -910,7 +904,7 @@
   __ CompareClassId(R1, kMintCid, R2);
   __ b(&fall_through, NE);
   // Receiver is Mint, return false if right is Smi.
-  __ tst(R0, ShifterOperand(kSmiTagMask));
+  __ tst(R0, Operand(kSmiTagMask));
   __ b(&fall_through, NE);
   __ LoadObject(R0, Bool::False());
   __ Ret();
@@ -940,7 +934,7 @@
   __ CompareImmediate(R0, 0x1F);
   __ LoadImmediate(R0, 0x1F, GT);
   __ SmiUntag(R1);
-  __ mov(R0, ShifterOperand(R1, ASR, R0));
+  __ mov(R0, Operand(R1, ASR, R0));
   __ SmiTag(R0);
   __ Ret();
   __ Bind(&fall_through);
@@ -949,8 +943,8 @@
 
 void Intrinsifier::Smi_bitNegate(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ mvn(R0, ShifterOperand(R0));
-  __ bic(R0, R0, ShifterOperand(kSmiTagMask));  // Remove inverted smi-tag.
+  __ mvn(R0, Operand(R0));
+  __ bic(R0, R0, Operand(kSmiTagMask));  // Remove inverted smi-tag.
   __ Ret();
 }
 
@@ -967,7 +961,7 @@
                                      Label* is_smi,
                                      Label* not_double_smi) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
-  __ tst(R0, ShifterOperand(kSmiTagMask));
+  __ tst(R0, Operand(kSmiTagMask));
   __ b(is_smi, EQ);
   __ CompareClassId(R0, kDoubleCid, R1);
   __ b(not_double_smi, NE);
@@ -1088,7 +1082,7 @@
     Label fall_through;
     // Only smis allowed.
     __ ldr(R0, Address(SP, 0 * kWordSize));
-    __ tst(R0, ShifterOperand(kSmiTagMask));
+    __ tst(R0, Operand(kSmiTagMask));
     __ b(&fall_through, NE);
     // Is Smi.
     __ SmiUntag(R0);
@@ -1112,7 +1106,7 @@
     Label fall_through;
 
     __ ldr(R0, Address(SP, 0 * kWordSize));
-    __ tst(R0, ShifterOperand(kSmiTagMask));
+    __ tst(R0, Operand(kSmiTagMask));
     __ b(&fall_through, NE);
     // Is Smi.
     __ SmiUntag(R0);
@@ -1164,8 +1158,8 @@
     __ Bind(&is_zero);
     // Check for negative zero by looking at the sign bit.
     __ vmovrrd(R0, R1, D0);  // R1:R0 <- D0, so sign bit is in bit 31 of R1.
-    __ mov(R1, ShifterOperand(R1, LSR, 31));
-    __ tst(R1, ShifterOperand(1));
+    __ mov(R1, Operand(R1, LSR, 31));
+    __ tst(R1, Operand(1));
     __ b(&is_true, NE);  // Sign bit set.
     __ b(&is_false);
   }
@@ -1256,7 +1250,7 @@
     __ LoadImmediate(R0, a_int32_value);
     __ LoadFromOffset(kWord, R2, R1, disp_0 - kHeapObjectTag);
     __ LoadFromOffset(kWord, R3, R1, disp_1 - kHeapObjectTag);
-    __ mov(R6, ShifterOperand(0));  // Zero extend unsigned _state[kSTATE_HI].
+    __ mov(R6, Operand(0));  // Zero extend unsigned _state[kSTATE_HI].
     // Unsigned 32-bit multiply and 64-bit accumulate into R6:R3.
     __ umlal(R3, R6, R0, R2);  // R6:R3 <- R6:R3 + R0 * R2.
     __ StoreToOffset(kWord, R3, R1, disp_0 - kHeapObjectTag);
@@ -1269,7 +1263,7 @@
 void Intrinsifier::Object_equal(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R1, Address(SP, 1 * kWordSize));
-  __ cmp(R0, ShifterOperand(R1));
+  __ cmp(R0, Operand(R1));
   __ LoadObject(R0, Bool::False(), NE);
   __ LoadObject(R0, Bool::True(), EQ);
   __ Ret();
@@ -1279,7 +1273,7 @@
 void Intrinsifier::String_getHashCode(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, String::hash_offset()));
-  __ cmp(R0, ShifterOperand(0));
+  __ cmp(R0, Operand(0));
   __ bx(LR, NE);  // Hash not yet computed.
 }
 
@@ -1296,11 +1290,11 @@
 
   __ ldr(R1, Address(SP, 0 * kWordSize));  // Index.
   __ ldr(R0, Address(SP, 1 * kWordSize));  // String.
-  __ tst(R1, ShifterOperand(kSmiTagMask));
+  __ tst(R1, Operand(kSmiTagMask));
   __ b(&fall_through, NE);  // Index is not a Smi.
   // Range check.
   __ ldr(R2, FieldAddress(R0, String::length_offset()));
-  __ cmp(R1, ShifterOperand(R2));
+  __ cmp(R1, Operand(R2));
   __ b(&fall_through, CS);  // Runtime throws exception.
   __ CompareClassId(R0, kOneByteStringCid, R3);
   __ b(&try_two_byte_string, NE);
@@ -1326,7 +1320,7 @@
 void Intrinsifier::String_getIsEmpty(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, String::length_offset()));
-  __ cmp(R0, ShifterOperand(Smi::RawValue(0)));
+  __ cmp(R0, Operand(Smi::RawValue(0)));
   __ LoadObject(R0, Bool::True(), EQ);
   __ LoadObject(R0, Bool::False(), NE);
   __ Ret();
@@ -1336,18 +1330,18 @@
 void Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
   __ ldr(R1, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R1, String::hash_offset()));
-  __ cmp(R0, ShifterOperand(0));
+  __ cmp(R0, Operand(0));
   __ bx(LR, NE);  // Return if already computed.
 
   __ ldr(R2, FieldAddress(R1, String::length_offset()));
 
   Label done;
   // If the string is empty, set the hash to 1, and return.
-  __ cmp(R2, ShifterOperand(Smi::RawValue(0)));
+  __ cmp(R2, Operand(Smi::RawValue(0)));
   __ b(&done, EQ);
 
   __ SmiUntag(R2);
-  __ mov(R3, ShifterOperand(0));
+  __ mov(R3, Operand(0));
   __ AddImmediate(R6, R1, OneByteString::data_offset() - kHeapObjectTag);
   // R1: Instance of OneByteString.
   // R2: String length, untagged integer.
@@ -1364,28 +1358,28 @@
   __ Bind(&loop);
   __ ldrb(R7, Address(R6, 0));
   // R7: ch.
-  __ add(R3, R3, ShifterOperand(1));
-  __ add(R6, R6, ShifterOperand(1));
-  __ add(R0, R0, ShifterOperand(R7));
-  __ add(R0, R0, ShifterOperand(R0, LSL, 10));
-  __ eor(R0, R0, ShifterOperand(R0, LSR, 6));
-  __ cmp(R3, ShifterOperand(R2));
+  __ add(R3, R3, Operand(1));
+  __ add(R6, R6, Operand(1));
+  __ add(R0, R0, Operand(R7));
+  __ add(R0, R0, Operand(R0, LSL, 10));
+  __ eor(R0, R0, Operand(R0, LSR, 6));
+  __ cmp(R3, Operand(R2));
   __ b(&loop, NE);
 
   // Finalize.
   // hash_ += hash_ << 3;
   // hash_ ^= hash_ >> 11;
   // hash_ += hash_ << 15;
-  __ add(R0, R0, ShifterOperand(R0, LSL, 3));
-  __ eor(R0, R0, ShifterOperand(R0, LSR, 11));
-  __ add(R0, R0, ShifterOperand(R0, LSL, 15));
+  __ add(R0, R0, Operand(R0, LSL, 3));
+  __ eor(R0, R0, Operand(R0, LSR, 11));
+  __ add(R0, R0, Operand(R0, LSL, 15));
   // hash_ = hash_ & ((static_cast<intptr_t>(1) << bits) - 1);
   __ LoadImmediate(R2, (static_cast<intptr_t>(1) << String::kHashBits) - 1);
-  __ and_(R0, R0, ShifterOperand(R2));
-  __ cmp(R0, ShifterOperand(0));
+  __ and_(R0, R0, Operand(R2));
+  __ cmp(R0, Operand(0));
   // return hash_ == 0 ? 1 : hash_;
   __ Bind(&done);
-  __ mov(R0, ShifterOperand(1), EQ);
+  __ mov(R0, Operand(1), EQ);
   __ SmiTag(R0);
   __ str(R0, FieldAddress(R1, String::hash_offset()));
   __ Ret();
@@ -1402,11 +1396,11 @@
   const Register length_reg = R2;
   Label fail;
 
-  __ mov(R6, ShifterOperand(length_reg));  // Save the length register.
+  __ mov(R6, Operand(length_reg));  // Save the length register.
   __ SmiUntag(length_reg);
   const intptr_t fixed_size = sizeof(RawString) + kObjectAlignment - 1;
   __ AddImmediate(length_reg, fixed_size);
-  __ bic(length_reg, length_reg, ShifterOperand(kObjectAlignment - 1));
+  __ bic(length_reg, length_reg, Operand(kObjectAlignment - 1));
 
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
@@ -1415,7 +1409,7 @@
   __ ldr(R0, Address(R3, 0));
 
   // length_reg: allocation size.
-  __ adds(R1, R0, ShifterOperand(length_reg));
+  __ adds(R1, R0, Operand(length_reg));
   __ b(&fail, VS);  // Fail on overflow.
 
   // Check if the allocation fits into the remaining space.
@@ -1425,7 +1419,7 @@
   // R3: heap->Top->Address().
   __ LoadImmediate(R7, heap->EndAddress());
   __ ldr(R7, Address(R7, 0));
-  __ cmp(R1, ShifterOperand(R7));
+  __ cmp(R1, Operand(R7));
   __ b(&fail, CS);
 
   // Successfully allocated the object(s), now update top to point to
@@ -1444,13 +1438,13 @@
         Class::Handle(isolate->object_store()->one_byte_string_class());
 
     __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag);
-    __ mov(R2, ShifterOperand(R2, LSL, shift), LS);
-    __ mov(R2, ShifterOperand(0), HI);
+    __ mov(R2, Operand(R2, LSL, shift), LS);
+    __ mov(R2, Operand(0), HI);
 
     // Get the class index and insert it into the tags.
     // R2: size and bit tags.
     __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
-    __ orr(R2, R2, ShifterOperand(TMP));
+    __ orr(R2, R2, Operand(TMP));
     __ str(R2, FieldAddress(R0, String::tags_offset()));  // Store tags.
   }
 
@@ -1480,11 +1474,11 @@
 
   __ ldr(R2, Address(SP, kEndIndexOffset));
   __ ldr(TMP, Address(SP, kStartIndexOffset));
-  __ orr(R3, R2,  ShifterOperand(TMP));
-  __ tst(R3, ShifterOperand(kSmiTagMask));
+  __ orr(R3, R2,  Operand(TMP));
+  __ tst(R3, Operand(kSmiTagMask));
   __ b(&fall_through, NE);  // 'start', 'end' not Smi.
 
-  __ sub(R2, R2, ShifterOperand(TMP));
+  __ sub(R2, R2, Operand(TMP));
   TryAllocateOnebyteString(assembler, &ok, &fall_through);
   __ Bind(&ok);
   // R0: new string as tagged pointer.
@@ -1492,7 +1486,7 @@
   __ ldr(R3, Address(SP, kStringOffset));
   __ ldr(R1, Address(SP, kStartIndexOffset));
   __ SmiUntag(R1);
-  __ add(R3, R3, ShifterOperand(R1));
+  __ add(R3, R3, Operand(R1));
   // Calculate start address and untag (- 1).
   __ AddImmediate(R3, OneByteString::data_offset() - 1);
 
@@ -1500,7 +1494,7 @@
   // R1: Untagged start index.
   __ ldr(R2, Address(SP, kEndIndexOffset));
   __ SmiUntag(R2);
-  __ sub(R2, R2, ShifterOperand(R1));
+  __ sub(R2, R2, Operand(R1));
 
   // R3: Start address to copy from (untagged).
   // R2: Untagged number of bytes to copy.
@@ -1509,15 +1503,15 @@
   // R7: Pointer into R0.
   // R1: Scratch register.
   Label loop, done;
-  __ cmp(R2, ShifterOperand(0));
+  __ cmp(R2, Operand(0));
   __ b(&done, LE);
-  __ mov(R6, ShifterOperand(R3));
-  __ mov(R7, ShifterOperand(R0));
+  __ mov(R6, Operand(R3));
+  __ mov(R7, Operand(R0));
   __ Bind(&loop);
   __ ldrb(R1, Address(R6, 0));
   __ AddImmediate(R6, 1);
-  __ sub(R2, R2, ShifterOperand(1));
-  __ cmp(R2, ShifterOperand(0));
+  __ sub(R2, R2, Operand(1));
+  __ cmp(R2, Operand(0));
   __ strb(R1, FieldAddress(R7, OneByteString::data_offset()));
   __ AddImmediate(R7, 1);
   __ b(&loop, GT);
@@ -1559,11 +1553,11 @@
   __ ldr(R1, Address(SP, 0 * kWordSize));  // Other.
 
   // Are identical?
-  __ cmp(R0, ShifterOperand(R1));
+  __ cmp(R0, Operand(R1));
   __ b(&is_true, EQ);
 
   // Is other OneByteString?
-  __ tst(R1, ShifterOperand(kSmiTagMask));
+  __ tst(R1, Operand(kSmiTagMask));
   __ b(&fall_through, EQ);
   __ CompareClassId(R1, string_cid, R2);
   __ b(&fall_through, NE);
@@ -1571,7 +1565,7 @@
   // Have same length?
   __ ldr(R2, FieldAddress(R0, String::length_offset()));
   __ ldr(R3, FieldAddress(R1, String::length_offset()));
-  __ cmp(R2, ShifterOperand(R3));
+  __ cmp(R2, Operand(R3));
   __ b(&is_false, NE);
 
   // Check contents, no fall-through possible.
@@ -1585,7 +1579,7 @@
   __ SmiUntag(R2);
   __ Bind(&loop);
   __ AddImmediate(R2, -1);
-  __ cmp(R2, ShifterOperand(0));
+  __ cmp(R2, Operand(0));
   __ b(&is_true, LT);
   if (string_cid == kOneByteStringCid) {
     __ ldrb(R3, Address(R0));
@@ -1600,7 +1594,7 @@
   } else {
     UNIMPLEMENTED();
   }
-  __ cmp(R3, ShifterOperand(R4));
+  __ cmp(R3, Operand(R4));
   __ b(&is_false, NE);
   __ b(&loop);
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 1fcf7e4..076c369 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -45,6 +45,10 @@
             "Pause isolates exiting.");
 
 
+// Quick access to the locally defined isolate() method.
+#define I (isolate())
+
+
 void Isolate::RegisterClass(const Class& cls) {
   class_table()->Register(cls);
 }
@@ -74,7 +78,7 @@
   void CheckAccess();
 #endif
   bool IsCurrentIsolate() const;
-  virtual Isolate* GetIsolate() const { return isolate_; }
+  virtual Isolate* isolate() const { return isolate_; }
   bool UnhandledExceptionCallbackHandler(const Object& message,
                                          const UnhandledException& error);
 
@@ -101,27 +105,27 @@
 void IsolateMessageHandler::MessageNotify(Message::Priority priority) {
   if (priority >= Message::kOOBPriority) {
     // Handle out of band messages even if the isolate is busy.
-    isolate_->ScheduleInterrupts(Isolate::kMessageInterrupt);
+    I->ScheduleInterrupts(Isolate::kMessageInterrupt);
   }
-  Dart_MessageNotifyCallback callback = isolate_->message_notify_callback();
+  Dart_MessageNotifyCallback callback = I->message_notify_callback();
   if (callback) {
     // Allow the embedder to handle message notification.
-    (*callback)(Api::CastIsolate(isolate_));
+    (*callback)(Api::CastIsolate(I));
   }
 }
 
 
 bool IsolateMessageHandler::HandleMessage(Message* message) {
-  StartIsolateScope start_scope(isolate_);
-  StackZone zone(isolate_);
-  HandleScope handle_scope(isolate_);
+  StartIsolateScope start_scope(I);
+  StackZone zone(I);
+  HandleScope handle_scope(I);
   // TODO(turnidge): Rework collection total dart execution.  This can
   // overcount when other things (gc, compilation) are active.
   TIMERSCOPE(isolate_, time_dart_execution);
 
   // If the message is in band we lookup the handler to dispatch to.  If the
   // receive port was closed, we drop the message without deserializing it.
-  Object& msg_handler = Object::Handle();
+  Object& msg_handler = Object::Handle(I);
   if (!message->IsOOB()) {
     msg_handler = DartLibraryCalls::LookupHandler(message->dest_port());
     if (msg_handler.IsError()) {
@@ -129,15 +133,20 @@
                                        Error::Cast(msg_handler));
     }
     if (msg_handler.IsNull()) {
-      delete message;
+      // If the port has been closed then the message will be dropped at this
+      // point. Make sure to post to the delivery failure port in that case.
+      if (message->RedirectToDeliveryFailurePort()) {
+        PortMap::PostMessage(message);
+      } else {
+        delete message;
+      }
       return true;
     }
   }
 
   // Parse the message.
-  SnapshotReader reader(message->data(), message->len(),
-                        Snapshot::kMessage, Isolate::Current());
-  const Object& msg_obj = Object::Handle(reader.ReadObject());
+  SnapshotReader reader(message->data(), message->len(), Snapshot::kMessage, I);
+  const Object& msg_obj = Object::Handle(I, reader.ReadObject());
   if (msg_obj.IsError()) {
     // An error occurred while reading the message.
     return ProcessUnhandledException(Object::null_instance(),
@@ -152,14 +161,26 @@
     UNREACHABLE();
   }
 
-  Instance& msg = Instance::Handle();
+  Instance& msg = Instance::Handle(I);
   msg ^= msg_obj.raw();  // Can't use Instance::Cast because may be null.
 
   bool success = true;
   if (message->IsOOB()) {
-    Service::HandleIsolateMessage(isolate_, msg);
+    ASSERT(msg.IsArray());
+    const Object& oob_tag = Object::Handle(I, Array::Cast(msg).At(0));
+    ASSERT(oob_tag.IsSmi());
+    switch (Smi::Cast(oob_tag).Value()) {
+      case Message::kServiceOOBMsg: {
+        Service::HandleIsolateMessage(I, msg);
+        break;
+      }
+      default: {
+        UNREACHABLE();
+        break;
+      }
+    }
   } else {
-    const Object& result = Object::Handle(
+    const Object& result = Object::Handle(I,
         DartLibraryCalls::HandleMessage(msg_handler, msg));
     if (result.IsError()) {
       success = ProcessUnhandledException(msg, Error::Cast(result));
@@ -173,20 +194,17 @@
 
 
 RawFunction* IsolateMessageHandler::ResolveCallbackFunction() {
-  ASSERT(isolate_->object_store()->unhandled_exception_handler() != NULL);
-  String& callback_name = String::Handle(isolate_);
-  if (isolate_->object_store()->unhandled_exception_handler() !=
-      String::null()) {
-    callback_name = isolate_->object_store()->unhandled_exception_handler();
+  ASSERT(I->object_store()->unhandled_exception_handler() != NULL);
+  String& callback_name = String::Handle(I);
+  if (I->object_store()->unhandled_exception_handler() != String::null()) {
+    callback_name = I->object_store()->unhandled_exception_handler();
   } else {
     callback_name = String::New("_unhandledExceptionCallback");
   }
-  Library& lib =
-      Library::Handle(isolate_, isolate_->object_store()->isolate_library());
-  Function& func =
-      Function::Handle(isolate_, lib.LookupLocalFunction(callback_name));
+  Library& lib = Library::Handle(I, I->object_store()->isolate_library());
+  Function& func = Function::Handle(I, lib.LookupLocalFunction(callback_name));
   if (func.IsNull()) {
-    lib = isolate_->object_store()->root_library();
+    lib = I->object_store()->root_library();
     // Note: bootstrap code in builtin library may attempt to resolve a
     // callback function before the script is fully loaded, in which case
     // the root library may not be registered yet.
@@ -200,34 +218,31 @@
 
 bool IsolateMessageHandler::UnhandledExceptionCallbackHandler(
     const Object& message, const UnhandledException& error) {
-  const Instance& cause = Instance::Handle(isolate_, error.exception());
-  const Instance& stacktrace =
-      Instance::Handle(isolate_, error.stacktrace());
+  const Instance& cause = Instance::Handle(I, error.exception());
+  const Instance& stacktrace = Instance::Handle(I, error.stacktrace());
 
   // Wrap these args into an IsolateUncaughtException object.
-  const Array& exception_args = Array::Handle(Array::New(3));
+  const Array& exception_args = Array::Handle(I, Array::New(3));
   exception_args.SetAt(0, message);
   exception_args.SetAt(1, cause);
   exception_args.SetAt(2, stacktrace);
-  const Object& exception =
-      Object::Handle(isolate_,
-                     Exceptions::Create(Exceptions::kIsolateUnhandledException,
-                                        exception_args));
+  const Object& exception = Object::Handle(I,
+      Exceptions::Create(Exceptions::kIsolateUnhandledException,
+                         exception_args));
   if (exception.IsError()) {
     return false;
   }
   ASSERT(exception.IsInstance());
 
   // Invoke script's callback function.
-  Object& function = Object::Handle(isolate_, ResolveCallbackFunction());
+  Object& function = Object::Handle(I, ResolveCallbackFunction());
   if (function.IsNull() || function.IsError()) {
     return false;
   }
-  const Array& callback_args = Array::Handle(Array::New(1));
+  const Array& callback_args = Array::Handle(I, Array::New(1));
   callback_args.SetAt(0, exception);
-  const Object& result =
-      Object::Handle(DartEntry::InvokeFunction(Function::Cast(function),
-                                               callback_args));
+  const Object& result = Object::Handle(I,
+      DartEntry::InvokeFunction(Function::Cast(function), callback_args));
   if (result.IsError()) {
     const Error& err = Error::Cast(result);
     OS::PrintErr("failed calling unhandled exception callback: %s\n",
@@ -238,7 +253,7 @@
   ASSERT(result.IsBool());
   bool continue_from_exception = Bool::Cast(result).value();
   if (continue_from_exception) {
-    isolate_->object_store()->clear_sticky_error();
+    I->object_store()->clear_sticky_error();
   }
   return continue_from_exception;
 }
@@ -251,7 +266,7 @@
 
 
 bool IsolateMessageHandler::IsCurrentIsolate() const {
-  return (isolate_ == Isolate::Current());
+  return (I == Isolate::Current());
 }
 
 
@@ -261,8 +276,8 @@
     // Invoke the isolate's uncaught exception handler, if it exists.
     const UnhandledException& error = UnhandledException::Cast(result);
     RawInstance* exception = error.exception();
-    if ((exception != isolate_->object_store()->out_of_memory()) &&
-        (exception != isolate_->object_store()->stack_overflow())) {
+    if ((exception != I->object_store()->out_of_memory()) &&
+        (exception != I->object_store()->stack_overflow())) {
       if (UnhandledExceptionCallbackHandler(message, error)) {
         return true;
       }
@@ -272,12 +287,12 @@
   // Invoke the isolate's unhandled exception callback if there is one.
   if (Isolate::UnhandledExceptionCallback() != NULL) {
     Dart_EnterScope();
-    Dart_Handle error = Api::NewHandle(isolate_, result.raw());
+    Dart_Handle error = Api::NewHandle(I, result.raw());
     (Isolate::UnhandledExceptionCallback())(error);
     Dart_ExitScope();
   }
 
-  isolate_->object_store()->set_sticky_error(result);
+  I->object_store()->set_sticky_error(result);
   return false;
 }
 
@@ -1006,15 +1021,34 @@
 }
 
 
-void Isolate::ProfileInterrupt() {
+intptr_t Isolate::ProfileInterrupt() {
+  if (profiler_data() == NULL) {
+    // Profiler not setup for isolate.
+    return 0;
+  }
+  if (profiler_data()->blocked()) {
+    // Profiler blocked for this isolate.
+    return 0;
+  }
+  if ((debugger() != NULL) && debugger()->IsPaused()) {
+    // Paused at breakpoint. Don't tick.
+    return 0;
+  }
+  if ((message_handler() != NULL) &&
+      (message_handler()->paused_on_start() ||
+       message_handler()->paused_on_exit())) {
+    // Paused at start / exit . Don't tick.
+    return 0;
+  }
   InterruptableThreadState* state = thread_state();
   if (state == NULL) {
     // Isolate is not scheduled on a thread.
     ProfileIdle();
-    return;
+    return 1;
   }
   ASSERT(state->id != Thread::kInvalidThreadId);
   ThreadInterrupter::InterruptThread(state);
+  return 1;
 }
 
 
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index bad6ffa..d5fc12c 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -487,7 +487,8 @@
     return thread_state_;
   }
 
-  void ProfileInterrupt();
+  // Returns the number of sampled threads.
+  intptr_t ProfileInterrupt();
 
   VMTagCounters* vm_tag_counters() {
     return &vm_tag_counters_;
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index afbe30e..be4abf7 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -36,8 +36,8 @@
 void JSONStream::Setup(Zone* zone,
                        Dart_Port reply_port,
                        const GrowableObjectArray& path,
-                       const GrowableObjectArray& option_keys,
-                       const GrowableObjectArray& option_values) {
+                       const Array& option_keys,
+                       const Array& option_values) {
   set_reply_port(reply_port);
 
   // Setup JSONStream arguments and options. The arguments and options
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 1e40f66..ddebaa7 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -13,6 +13,7 @@
 
 class DebuggerEvent;
 class Field;
+class Array;
 class GrowableObjectArray;
 class Instance;
 class JSONArray;
@@ -29,8 +30,8 @@
   void Setup(Zone* zone,
              Dart_Port reply_port,
              const GrowableObjectArray& path,
-             const GrowableObjectArray& option_keys,
-             const GrowableObjectArray& option_values);
+             const Array& option_keys,
+             const Array& option_values);
   void PostReply();
 
   TextBuffer* buffer() { return &buffer_; }
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index ee2ed2c..31049c4 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -71,11 +71,12 @@
 
 
 LocationSummary* LocationSummary::Make(
+    Isolate* isolate,
     intptr_t input_count,
     Location out,
     LocationSummary::ContainsCall contains_call) {
-  LocationSummary* summary = new LocationSummary(
-      Isolate::Current(), input_count, 0, contains_call);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, input_count, 0, contains_call);
   for (intptr_t i = 0; i < input_count; i++) {
     summary->set_in(i, Location::RequiresRegister());
   }
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index d01ebdb..95764dc 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -97,47 +97,31 @@
   Location() : value_(kInvalidLocation) {
     // Verify that non-tagged location kinds do not interfere with location tags
     // (kConstantTag and kPairLocationTag).
-    COMPILE_ASSERT(((kInvalid & kLocationTagMask) != kConstantTag),
-                   invalid_conflicts_with_constant_tag);
-    COMPILE_ASSERT(((kInvalid & kLocationTagMask) != kPairLocationTag),
-                   invalid_conflicts_with_pair_tag);
+    COMPILE_ASSERT((kInvalid & kLocationTagMask) != kConstantTag);
+    COMPILE_ASSERT((kInvalid & kLocationTagMask) != kPairLocationTag);
 
-    COMPILE_ASSERT(((kUnallocated & kLocationTagMask) != kConstantTag),
-                   unallocated_conflicts_with_constant_tag);
-    COMPILE_ASSERT(((kUnallocated & kLocationTagMask) != kPairLocationTag),
-                   unallocated_conflicts_with_pair_tag);
+    COMPILE_ASSERT((kUnallocated & kLocationTagMask) != kConstantTag);
+    COMPILE_ASSERT((kUnallocated & kLocationTagMask) != kPairLocationTag);
 
-    COMPILE_ASSERT(((kStackSlot & kLocationTagMask) != kConstantTag),
-                   stackslot_conflicts_with_constant_tag);
-    COMPILE_ASSERT(((kStackSlot & kLocationTagMask) != kPairLocationTag),
-                   stackslot_conflicts_with_pair_tag);
+    COMPILE_ASSERT((kStackSlot & kLocationTagMask) != kConstantTag);
+    COMPILE_ASSERT((kStackSlot & kLocationTagMask) != kPairLocationTag);
 
-    COMPILE_ASSERT(((kDoubleStackSlot & kLocationTagMask) != kConstantTag),
-                   doublestackslot_conflicts_with_constant_tag);
-    COMPILE_ASSERT(((kDoubleStackSlot & kLocationTagMask) != kPairLocationTag),
-                   doublestackslot_conflicts_with_pair_tag);
+    COMPILE_ASSERT((kDoubleStackSlot & kLocationTagMask) != kConstantTag);
+    COMPILE_ASSERT((kDoubleStackSlot & kLocationTagMask) != kPairLocationTag);
 
-    COMPILE_ASSERT(((kQuadStackSlot & kLocationTagMask) != kConstantTag),
-                   quadstackslot_conflicts_with_constant_tag);
-    COMPILE_ASSERT(((kQuadStackSlot & kLocationTagMask) != kPairLocationTag),
-                   quadstackslot_conflicts_with_pair_tag);
+    COMPILE_ASSERT((kQuadStackSlot & kLocationTagMask) != kConstantTag);
+    COMPILE_ASSERT((kQuadStackSlot & kLocationTagMask) != kPairLocationTag);
 
-    COMPILE_ASSERT(((kRegister & kLocationTagMask) != kConstantTag),
-                   register_conflicts_with_constant_tag);
-    COMPILE_ASSERT(((kRegister & kLocationTagMask) != kPairLocationTag),
-                   register_conflicts_with_pair_tag);
+    COMPILE_ASSERT((kRegister & kLocationTagMask) != kConstantTag);
+    COMPILE_ASSERT((kRegister & kLocationTagMask) != kPairLocationTag);
 
-    COMPILE_ASSERT(((kFpuRegister & kLocationTagMask) != kConstantTag),
-                   fpuregister_conflicts_with_constant_tag);
-    COMPILE_ASSERT(((kFpuRegister & kLocationTagMask) != kPairLocationTag),
-                   fpuregister_conflicts_with_pair_tag);
+    COMPILE_ASSERT((kFpuRegister & kLocationTagMask) != kConstantTag);
+    COMPILE_ASSERT((kFpuRegister & kLocationTagMask) != kPairLocationTag);
 
     // Verify tags and tagmask.
-    COMPILE_ASSERT(((kConstantTag & kLocationTagMask) == kConstantTag),
-                   bad_constant_tag);
+    COMPILE_ASSERT((kConstantTag & kLocationTagMask) == kConstantTag);
 
-    COMPILE_ASSERT(((kPairLocationTag & kLocationTagMask) == kPairLocationTag),
-                  bad_pair_tag);
+    COMPILE_ASSERT((kPairLocationTag & kLocationTagMask) == kPairLocationTag);
 
     ASSERT(IsInvalid());
   }
@@ -615,7 +599,8 @@
 
   void PrintTo(BufferFormatter* f) const;
 
-  static LocationSummary* Make(intptr_t input_count,
+  static LocationSummary* Make(Isolate* isolate,
+                               intptr_t input_count,
                                Location out,
                                ContainsCall contains_call);
 
diff --git a/runtime/vm/message.cc b/runtime/vm/message.cc
index 73f5da3..2a83dc7 100644
--- a/runtime/vm/message.cc
+++ b/runtime/vm/message.cc
@@ -4,8 +4,20 @@
 
 #include "vm/message.h"
 
+#include "vm/port.h"
+
 namespace dart {
 
+bool Message::RedirectToDeliveryFailurePort() {
+  if (delivery_failure_port_ == kIllegalPort) {
+    return false;
+  }
+  dest_port_ = delivery_failure_port_;
+  delivery_failure_port_ = kIllegalPort;
+  return true;
+}
+
+
 MessageQueue::MessageQueue() {
   head_ = NULL;
   tail_ = NULL;
@@ -59,7 +71,11 @@
   tail_ = NULL;
   while (cur != NULL) {
     Message* next = cur->next_;
-    delete cur;
+    if (cur->RedirectToDeliveryFailurePort()) {
+      PortMap::PostMessage(cur);
+    } else {
+      delete cur;
+    }
     cur = next;
   }
 }
diff --git a/runtime/vm/message.h b/runtime/vm/message.h
index 6d44c02..3b06cc9 100644
--- a/runtime/vm/message.h
+++ b/runtime/vm/message.h
@@ -23,21 +23,38 @@
     kNumPriorities = 2,
   } Priority;
 
+  // Values defining the type of OOB messages. OOB messages can only be
+  // fixed length arrays where the first element is a Smi with one of the
+  // valid values below.
+  typedef enum {
+    kIllegalOOB = 0,
+    kServiceOOBMsg = 1,
+    kIsolateLibOOBMsg = 2
+  } OOBMsgTag;
+
   // A port number which is never used.
   static const Dart_Port kIllegalPort = 0;
 
   // A new message to be sent between two isolates. The data handed to this
   // message will be disposed by calling free() once the message object is
   // being destructed (after delivery or when the receiving port is closed).
-  Message(Dart_Port dest_port, uint8_t* data, intptr_t len, Priority priority)
+  Message(Dart_Port dest_port,
+          uint8_t* data,
+          intptr_t len,
+          Priority priority,
+          Dart_Port delivery_failure_port = kIllegalPort)
       : next_(NULL),
         dest_port_(dest_port),
+        delivery_failure_port_(delivery_failure_port),
         data_(data),
         len_(len),
         priority_(priority) {
     ASSERT(dest_port != kIllegalPort);
+    ASSERT((priority == kNormalPriority) ||
+           (delivery_failure_port == kIllegalPort));
   }
   ~Message() {
+    ASSERT(delivery_failure_port_ == kIllegalPort);
     free(data_);
   }
 
@@ -48,11 +65,14 @@
 
   bool IsOOB() const { return priority_ == Message::kOOBPriority; }
 
+  bool RedirectToDeliveryFailurePort();
+
  private:
   friend class MessageQueue;
 
   Message* next_;
   Dart_Port dest_port_;
+  Dart_Port delivery_failure_port_;
   uint8_t* data_;
   intptr_t len_;
   Priority priority_;
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index b1064a2..ec88e1b 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -141,7 +141,7 @@
                                     ? Message::kNormalPriority
                                     : Message::kOOBPriority);
   Message* message = DequeueMessage(min_priority);
-  while (message) {
+  while (message != NULL) {
     if (FLAG_trace_isolates) {
       OS::Print("[<] Handling message:\n"
                 "\thandler:    %s\n"
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index dbc5d07..26507de 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -115,7 +115,7 @@
   virtual bool IsCurrentIsolate() const { return false; }
 
   // Return Isolate to which this message handler corresponds to.
-  virtual Isolate* GetIsolate() const { return NULL; }
+  virtual Isolate* isolate() const { return NULL; }
 
   // Posts a message on this handler's message queue.
   void PostMessage(Message* message);
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index ce565cf..a121d71 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -20,7 +20,6 @@
 
 
 static ExternalLabel native_call_label(
-    "native_function_call",
     reinterpret_cast<uword>(&NativeEntry::NativeCallWrapper));
 
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index a5e6ed6..5b358b5 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -65,7 +65,6 @@
 DEFINE_FLAG(bool, use_field_guards, true, "Guard field cids.");
 DEFINE_FLAG(bool, use_lib_cache, true, "Use library name cache");
 
-DECLARE_FLAG(bool, eliminate_type_checks);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, error_on_bad_override);
 DECLARE_FLAG(bool, trace_compiler);
@@ -1734,7 +1733,7 @@
   result.set_handle_vtable(fake.vtable());
   result.set_instance_size(FakeObject::InstanceSize());
   result.set_next_field_offset(FakeObject::NextFieldOffset());
-  ASSERT((FakeObject::kClassId != kInstanceCid));
+  COMPILE_ASSERT((FakeObject::kClassId != kInstanceCid));
   result.set_id(FakeObject::kClassId);
   result.set_state_bits(0);
   if (FakeObject::kClassId < kInstanceCid) {
@@ -4659,7 +4658,7 @@
   }
   // The zero array should have been initialized.
   ASSERT(Object::zero_array().raw() != Array::null());
-  COMPILE_ASSERT(StubCode::kNoInstantiator == 0, kNoInstantiator_must_be_zero);
+  COMPILE_ASSERT(StubCode::kNoInstantiator == 0);
   result.set_instantiations(Object::zero_array());
   return result.raw();
 }
@@ -4953,18 +4952,8 @@
 
 void Function::SwitchToUnoptimizedCode() const {
   ASSERT(HasOptimizedCode());
-
   const Code& current_code = Code::Handle(CurrentCode());
 
-  // Optimized code object might have been actually fully produced by the
-  // intrinsifier in this case nothing has to be done. In fact an attempt to
-  // patch such code will cause crash.
-  // TODO(vegorov): if intrisifier can fully intrinsify the function then we
-  // should not later try to optimize it.
-  if (PcDescriptors::Handle(current_code.pc_descriptors()).Length() == 0) {
-    return;
-  }
-
   if (FLAG_trace_disabling_optimized_code) {
     OS::Print("Disabling optimized code: '%s' entry: %#" Px "\n",
       ToFullyQualifiedCString(),
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 11edabf..cbdba7d 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -878,7 +878,6 @@
     return raw_ptr()->direct_subclasses_;
   }
   void AddDirectSubclass(const Class& subclass) const;
-  // TODO(regis): Implement RemoveDirectSubclass for class unloading support.
 
   // Check if this class represents the class of null.
   bool IsNullClass() const { return id() == kNullCid; }
diff --git a/runtime/vm/object_arm_test.cc b/runtime/vm/object_arm_test.cc
index ab6f791..c01e166 100644
--- a/runtime/vm/object_arm_test.cc
+++ b/runtime/vm/object_arm_test.cc
@@ -21,12 +21,12 @@
   __ LoadImmediate(R0, 0);
   __ Push(R0);
   __ ldr(IP, Address(SP, 0));
-  __ add(IP, IP, ShifterOperand(1));
+  __ add(IP, IP, Operand(1));
   __ str(IP, Address(SP, 0));
   __ ldr(IP, Address(SP, 0));
-  __ add(IP, IP, ShifterOperand(1));
+  __ add(IP, IP, Operand(1));
   __ Pop(R0);
-  __ mov(R0, ShifterOperand(IP));
+  __ mov(R0, Operand(IP));
   __ Ret();
 }
 
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index 0aaad3c..3e500e8 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -666,7 +666,7 @@
   asm("int $3");
 #elif defined(HOST_ARCH_ARM)
   asm("svc #0x9f0001");  // __ARM_NR_breakpoint
-#elif defined(HOST_ARCH_MIPS)
+#elif defined(HOST_ARCH_MIPS) || defined(HOST_ARCH_ARM64)
   UNIMPLEMENTED();
 #else
 #error Unsupported architecture.
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index c303585..21454f9 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -58,6 +58,11 @@
                     checked,
                     "Enable checked mode.");
 
+
+// Quick access to the locally defined isolate() method.
+#define I (isolate())
+
+
 #if defined(DEBUG)
 class TraceParser : public ValueObject {
  public:
@@ -305,7 +310,7 @@
       literal_token_(LiteralToken::Handle(isolate_)),
       current_class_(Class::Handle(isolate_,
                                    parsed_function->function().Owner())),
-      library_(Library::Handle(Class::Handle(
+      library_(Library::Handle(isolate_, Class::Handle(
           isolate_,
           parsed_function->function().origin()).library())),
       try_blocks_list_(NULL),
@@ -334,7 +339,8 @@
 
 void Parser::SetScript(const Script& script, intptr_t token_pos) {
   script_ = script.raw();
-  tokens_iterator_.SetStream(TokenStream::Handle(script.tokens()), token_pos);
+  tokens_iterator_.SetStream(
+      TokenStream::Handle(isolate(), script.tokens()), token_pos);
   token_kind_ = Token::kILLEGAL;
 }
 
@@ -387,15 +393,12 @@
 }
 
 
-Token::Kind Parser::CurrentToken() {
-  if (token_kind_ == Token::kILLEGAL) {
-    token_kind_ = tokens_iterator_.CurrentTokenKind();
-    if (token_kind_ == Token::kERROR) {
-      ErrorMsg(TokenPos(), "%s", CurrentLiteral()->ToCString());
-    }
+void Parser::ComputeCurrentToken() {
+  ASSERT(token_kind_ == Token::kILLEGAL);
+  token_kind_ = tokens_iterator_.CurrentTokenKind();
+  if (token_kind_ == Token::kERROR) {
+    ErrorMsg(TokenPos(), "%s", CurrentLiteral()->ToCString());
   }
-  CompilerStats::num_token_checks++;
-  return token_kind_;
 }
 
 
@@ -408,7 +411,7 @@
 
 String* Parser::CurrentLiteral() const {
   String& result =
-      String::ZoneHandle(isolate_, tokens_iterator_.CurrentLiteral());
+      String::ZoneHandle(I, tokens_iterator_.CurrentLiteral());
   return &result;
 }
 
@@ -425,7 +428,7 @@
   ASSERT(literal_token_.kind() == Token::kINTEGER);
   RawInteger* ri = Integer::RawCast(literal_token_.value());
   if (FLAG_throw_on_javascript_int_overflow) {
-    const Integer& i = Integer::Handle(ri);
+    const Integer& i = Integer::Handle(isolate(), ri);
     if (i.CheckJavascriptIntegerOverflow()) {
       ErrorMsg(TokenPos(),
           "Integer literal does not fit in a Javascript integer: %s.",
@@ -750,7 +753,7 @@
     const Class& owner = Class::Handle(isolate, func.Owner());
     ASSERT(!owner.IsNull());
     ParsedFunction* parsed_function = new ParsedFunction(
-        Function::ZoneHandle(func.raw()));
+        isolate, Function::ZoneHandle(isolate, func.raw()));
     Parser parser(script, parsed_function, func.token_pos());
     parser.SkipFunctionPreamble();
     ParamList params;
@@ -882,8 +885,8 @@
   StackZone zone(isolate);
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
-    const Script& script = Script::Handle(cls.script());
-    const Library& lib = Library::Handle(cls.library());
+    const Script& script = Script::Handle(isolate, cls.script());
+    const Library& lib = Library::Handle(isolate, cls.library());
     Parser parser(script, lib, token_pos);
     parser.set_current_class(cls);
     parser.set_parsing_metadata(true);
@@ -891,7 +894,7 @@
     RawObject* metadata = parser.EvaluateMetadata();
     return metadata;
   } else {
-    Error& error = Error::Handle();
+    Error& error = Error::Handle(isolate);
     error = isolate->object_store()->sticky_error();
     isolate->object_store()->clear_sticky_error();
     return error.raw();
@@ -904,7 +907,7 @@
 RawArray* Parser::EvaluateMetadata() {
   CheckToken(Token::kAT, "Metadata character '@' expected");
   GrowableObjectArray& meta_values =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
+      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
   while (CurrentToken() == Token::kAT) {
     ConsumeToken();
     intptr_t expr_pos = TokenPos();
@@ -912,7 +915,8 @@
       ExpectIdentifier("identifier expected");
     }
     // Reject expressions with deferred library prefix eagerly.
-    Object& obj = Object::Handle(library_.LookupLocalObject(*CurrentLiteral()));
+    Object& obj = Object::Handle(isolate(),
+                                 library_.LookupLocalObject(*CurrentLiteral()));
     if (!obj.IsNull() && obj.IsLibraryPrefix()) {
       if (LibraryPrefix::Cast(obj).is_deferred_load()) {
         ErrorMsg("Metadata must be compile-time constant");
@@ -929,7 +933,7 @@
     } else {
       // Can be x, C.x, or L.C.x.
       expr = ParsePrimary();  // Consumes x, C or L.C.
-      Class& cls = Class::Handle();
+      Class& cls = Class::Handle(isolate());
       if (expr->IsPrimaryNode()) {
         PrimaryNode* primary_node = expr->AsPrimaryNode();
         if (primary_node->primary().IsClass()) {
@@ -950,7 +954,8 @@
         ConsumeToken();
         const intptr_t ident_pos = TokenPos();
         String* ident = ExpectIdentifier("identifier expected");
-        const Field& field = Field::Handle(cls.LookupStaticField(*ident));
+        const Field& field = Field::Handle(isolate(),
+                                           cls.LookupStaticField(*ident));
         if (field.IsNull()) {
           ErrorMsg(ident_pos,
                    "Class '%s' has no field '%s'",
@@ -981,7 +986,7 @@
   ParamList params;
   ASSERT(func.num_fixed_parameters() == 0);  // static.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -989,9 +994,9 @@
 
   intptr_t ident_pos = TokenPos();
   const String& field_name = *ExpectIdentifier("field name expected");
-  const Class& field_class = Class::Handle(func.Owner());
+  const Class& field_class = Class::Handle(isolate(), func.Owner());
   const Field& field =
-      Field::ZoneHandle(field_class.LookupStaticField(field_name));
+      Field::ZoneHandle(I, field_class.LookupStaticField(field_name));
 
   // Static final fields must have an initializer.
   ExpectToken(Token::kASSIGN);
@@ -1037,7 +1042,7 @@
         new StoreStaticFieldNode(
             ident_pos,
             field,
-            new LiteralNode(ident_pos, Instance::ZoneHandle())));
+            new LiteralNode(ident_pos, Instance::ZoneHandle(I))));
     // Call CyclicInitializationError._throwNew(field_name).
     ArgumentListNode* error_arguments = new ArgumentListNode(ident_pos);
     error_arguments->Add(new LiteralNode(ident_pos, field_name));
@@ -1061,10 +1066,10 @@
             ident_pos,
             field,
             new LiteralNode(ident_pos, Object::transition_sentinel())));
-    const String& init_name = String::Handle(
-        Symbols::New(String::Handle(String::Concat(
-            Symbols::InitPrefix(), String::Handle(field.name())))));
-    const Function& init_function = Function::ZoneHandle(
+    const String& init_name = String::Handle(isolate(), Symbols::New(
+        String::Handle(isolate(), String::Concat(
+            Symbols::InitPrefix(), String::Handle(isolate(), field.name())))));
+    const Function& init_function = Function::ZoneHandle(I,
         field_class.LookupStaticFunction(init_name));
     ASSERT(!init_function.IsNull());
     ArgumentListNode* arguments = new ArgumentListNode(expr_pos);
@@ -1091,7 +1096,7 @@
   ParamList params;
   ASSERT(func.num_fixed_parameters() == 0);  // static.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1109,30 +1114,39 @@
   if (context_var == NULL) {
     context_var = new LocalVariable(token_pos,
                                     Symbols::SavedTryContextVar(),
-                                    Type::ZoneHandle(Type::DynamicType()));
+                                    Type::ZoneHandle(I, Type::DynamicType()));
     current_block_->scope->AddVariable(context_var);
   }
   LocalVariable* catch_excp_var =
       current_block_->scope->LocalLookupVariable(Symbols::ExceptionVar());
   if (catch_excp_var == NULL) {
-    catch_excp_var = new LocalVariable(token_pos,
-                                       Symbols::ExceptionVar(),
-                                       Type::ZoneHandle(Type::DynamicType()));
+    catch_excp_var = new LocalVariable(
+        token_pos,
+        Symbols::ExceptionVar(),
+        Type::ZoneHandle(I, Type::DynamicType()));
     current_block_->scope->AddVariable(catch_excp_var);
   }
   LocalVariable* catch_trace_var =
       current_block_->scope->LocalLookupVariable(Symbols::StackTraceVar());
   if (catch_trace_var == NULL) {
-    catch_trace_var = new LocalVariable(token_pos,
-                                        Symbols::StackTraceVar(),
-                                        Type::ZoneHandle(Type::DynamicType()));
+    catch_trace_var = new LocalVariable(
+        token_pos,
+        Symbols::StackTraceVar(),
+        Type::ZoneHandle(I, Type::DynamicType()));
     current_block_->scope->AddVariable(catch_trace_var);
   }
 
   OpenBlock();  // Start try block.
   AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
-  const Field& field = Field::ZoneHandle(func.saved_static_field());
+  const Field& field = Field::ZoneHandle(I, func.saved_static_field());
   ASSERT(!field.is_const());
+  if (FLAG_enable_type_checks) {
+    expr = new AssignableNode(
+        field.token_pos(),
+        expr,
+        AbstractType::ZoneHandle(isolate(), field.type()),
+        String::ZoneHandle(isolate(), field.name()));
+  }
   StoreStaticFieldNode* store = new StoreStaticFieldNode(field.token_pos(),
                                                          field,
                                                          expr);
@@ -1151,7 +1165,7 @@
   store_null->Add(new StoreStaticFieldNode(
       field.token_pos(),
       field,
-      new LiteralNode(token_pos, Instance::ZoneHandle())));
+      new LiteralNode(token_pos, Instance::ZoneHandle(I))));
   AstNode* transition_sentinel_check =
       new IfNode(token_pos, compare_transition_sentinel, store_null, NULL);
   current_block_->statements->Add(transition_sentinel_check);
@@ -1167,7 +1181,7 @@
   CatchClauseNode* catch_block =
       new CatchClauseNode(token_pos,
                           catch_handler_list,
-                          Array::ZoneHandle(Object::empty_array().raw()),
+                          Array::ZoneHandle(I, Object::empty_array().raw()),
                           context_var,
                           catch_excp_var,
                           catch_trace_var,
@@ -1198,7 +1212,7 @@
   params.AddReceiver(ReceiverType(current_class()), ident_pos);
   ASSERT(func.num_fixed_parameters() == 1);  // receiver.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1209,9 +1223,9 @@
   LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver);
   ASSERT(IsIdentifier());
   const String& field_name = *CurrentLiteral();
-  const Class& field_class = Class::Handle(func.Owner());
+  const Class& field_class = Class::Handle(isolate(), func.Owner());
   const Field& field =
-      Field::ZoneHandle(field_class.LookupInstanceField(field_name));
+      Field::ZoneHandle(I, field_class.LookupInstanceField(field_name));
 
   LoadInstanceFieldNode* load_field =
       new LoadInstanceFieldNode(ident_pos, load_receiver, field);
@@ -1233,10 +1247,10 @@
   // func.token_pos() points to the name of the field.
   const intptr_t ident_pos = func.token_pos();
   const String& field_name = *CurrentLiteral();
-  const Class& field_class = Class::ZoneHandle(func.Owner());
+  const Class& field_class = Class::ZoneHandle(I, func.Owner());
   const Field& field =
-      Field::ZoneHandle(field_class.LookupInstanceField(field_name));
-  const AbstractType& field_type = AbstractType::ZoneHandle(field.type());
+      Field::ZoneHandle(I, field_class.LookupInstanceField(field_name));
+  const AbstractType& field_type = AbstractType::ZoneHandle(I, field.type());
 
   ParamList params;
   ASSERT(current_class().raw() == func.Owner());
@@ -1246,7 +1260,7 @@
                            &field_type);
   ASSERT(func.num_fixed_parameters() == 2);  // receiver, value.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(func.result_type()).IsVoidType());
+  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsVoidType());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1287,7 +1301,7 @@
 
   ClosureNode* closure = new ClosureNode(
       ident_pos,
-      Function::ZoneHandle(func.extracted_method_closure()),
+      Function::ZoneHandle(I, func.extracted_method_closure()),
       load_receiver,
       NULL);
 
@@ -1310,8 +1324,8 @@
     ParamDesc p;
     char name[64];
     OS::SNPrint(name, 64, ":p%" Pd, i);
-    p.name = &String::ZoneHandle(Symbols::New(name));
-    p.type = &Type::ZoneHandle(Type::DynamicType());
+    p.name = &String::ZoneHandle(I, Symbols::New(name));
+    p.type = &Type::ZoneHandle(I, Type::DynamicType());
     params.parameters->Add(p);
     params.num_fixed_parameters++;
   }
@@ -1321,8 +1335,8 @@
   for (; i < desc.Count(); ++i) {
     ParamDesc p;
     intptr_t index = i - desc.PositionalCount();
-    p.name = &String::ZoneHandle(desc.NameAt(index));
-    p.type = &Type::ZoneHandle(Type::DynamicType());
+    p.name = &String::ZoneHandle(I, desc.NameAt(index));
+    p.type = &Type::ZoneHandle(I, Type::DynamicType());
     p.default_value = &Object::ZoneHandle();
     params.parameters->Add(p);
     params.num_optional_parameters++;
@@ -1346,7 +1360,7 @@
   ASSERT(func.token_pos() == 0);
   ASSERT(current_class().raw() == func.Owner());
 
-  ArgumentsDescriptor desc(Array::Handle(func.saved_args_desc()));
+  ArgumentsDescriptor desc(Array::Handle(isolate(), func.saved_args_desc()));
   ASSERT(desc.Count() > 0);
 
   // Set up scope for this function.
@@ -1360,19 +1374,20 @@
   }
 
   if (desc.NamedCount() > 0) {
-    const Array& arg_names = Array::ZoneHandle(Array::New(desc.NamedCount()));
+    const Array& arg_names =
+        Array::ZoneHandle(I, Array::New(desc.NamedCount()));
     for (intptr_t i = 0; i < arg_names.Length(); ++i) {
-      arg_names.SetAt(i, String::Handle(desc.NameAt(i)));
+      arg_names.SetAt(i, String::Handle(isolate(), desc.NameAt(i)));
     }
     func_args->set_names(arg_names);
   }
 
-  const String& func_name = String::ZoneHandle(func.name());
+  const String& func_name = String::ZoneHandle(I, func.name());
   ArgumentListNode* arguments = BuildNoSuchMethodArguments(
       token_pos, func_name, *func_args, NULL, false);
-  const Function& no_such_method = Function::ZoneHandle(
-      Resolver::ResolveDynamicAnyArgs(Class::Handle(func.Owner()),
-                                      Symbols::NoSuchMethod()));
+  const Function& no_such_method = Function::ZoneHandle(I,
+      Resolver::ResolveDynamicAnyArgs(Class::Handle(
+          isolate(), func.Owner()), Symbols::NoSuchMethod()));
   StaticCallNode* call =
       new StaticCallNode(token_pos, no_such_method, arguments);
 
@@ -1391,7 +1406,7 @@
   ASSERT(func.token_pos() == 0);
   ASSERT(current_class().raw() == func.Owner());
 
-  const Array& args_desc = Array::Handle(func.saved_args_desc());
+  const Array& args_desc = Array::Handle(isolate(), func.saved_args_desc());
   ArgumentsDescriptor desc(args_desc);
   ASSERT(desc.Count() > 0);
 
@@ -1403,17 +1418,16 @@
   ArgumentListNode* no_args = new ArgumentListNode(token_pos);
   LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0));
 
-  const String& name = String::Handle(func.name());
-  const String& getter_name =
-      String::ZoneHandle(Symbols::New(String::Handle(Field::GetterName(name))));
-  InstanceCallNode* getter_call = new InstanceCallNode(token_pos,
-                                                       receiver,
-                                                       getter_name,
-                                                       no_args);
+  const String& name = String::Handle(isolate(), func.name());
+  const String& getter_name = String::ZoneHandle(I,
+      Symbols::New(String::Handle(isolate(), Field::GetterName(name))));
+  InstanceCallNode* getter_call = new(isolate()) InstanceCallNode(
+      token_pos, receiver, getter_name, no_args);
 
   // Pass arguments 1..n to the closure call.
   ArgumentListNode* args = new ArgumentListNode(token_pos);
-  const Array& names = Array::Handle(Array::New(desc.NamedCount(), Heap::kOld));
+  const Array& names = Array::Handle(
+      isolate(), Array::New(desc.NamedCount(), Heap::kOld));
   // Positional parameters.
   intptr_t i = 1;
   for (; i < desc.PositionalCount(); ++i) {
@@ -1423,11 +1437,11 @@
   for (; i < desc.Count(); i++) {
     args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
     intptr_t index = i - desc.PositionalCount();
-    names.SetAt(index, String::Handle(desc.NameAt(index)));
+    names.SetAt(index, String::Handle(isolate(), desc.NameAt(index)));
   }
   args->set_names(names);
 
-  const Class& owner = Class::Handle(func.Owner());
+  const Class& owner = Class::Handle(isolate(), func.Owner());
   ASSERT(!owner.IsNull());
   AstNode* result = NULL;
   if (owner.IsSignatureClass() && name.Equals(Symbols::Call())) {
@@ -1508,7 +1522,7 @@
   bool this_seen = false;
 
   if (evaluate_metadata && (CurrentToken() == Token::kAT)) {
-    parameter.metadata = &Array::ZoneHandle(EvaluateMetadata());
+    parameter.metadata = &Array::ZoneHandle(I, EvaluateMetadata());
   } else {
     SkipMetadata();
   }
@@ -1522,7 +1536,7 @@
     // The parameter type is the 'dynamic' type.
     // If this is an initializing formal, its type will be set to the type of
     // the respective field when the constructor is fully parsed.
-    parameter.type = &Type::ZoneHandle(Type::DynamicType());
+    parameter.type = &Type::ZoneHandle(I, Type::DynamicType());
   }
   if (CurrentToken() == Token::kTHIS) {
     ConsumeToken();
@@ -1535,7 +1549,7 @@
     // This must later be changed to a closure type if we recognize
     // a closure/function type parameter. We check this at the end
     // of ParseFormalParameter.
-    parameter.type = &Type::ZoneHandle(Type::VoidType());
+    parameter.type = &Type::ZoneHandle(I, Type::VoidType());
   }
   if (parameter.type == NULL) {
     // At this point, we must see an identifier for the type or the
@@ -1556,13 +1570,13 @@
       // mode, because they are part of the function type of closurized
       // functions appearing in type tests with typedefs.
       parameter.has_explicit_type = true;
-      parameter.type = &AbstractType::ZoneHandle(
+      parameter.type = &AbstractType::ZoneHandle(I,
           ParseType(is_top_level_ ? ClassFinalizer::kResolveTypeParameters :
                                     ClassFinalizer::kCanonicalize));
     } else {
       // If this is an initializing formal, its type will be set to the type of
       // the respective field when the constructor is fully parsed.
-      parameter.type = &Type::ZoneHandle(Type::DynamicType());
+      parameter.type = &Type::ZoneHandle(I, Type::DynamicType());
     }
   }
   if (!this_seen && (CurrentToken() == Token::kTHIS)) {
@@ -1602,7 +1616,7 @@
     if (!var_seen && !parameter.is_final) {
       // The parsed parameter type is actually the function result type.
       const AbstractType& result_type =
-          AbstractType::Handle(parameter.type->raw());
+          AbstractType::Handle(isolate(), parameter.type->raw());
 
       // Finish parsing the function type parameter.
       ParamList func_params;
@@ -1611,13 +1625,13 @@
       func_params.AddFinalParameter(
           TokenPos(),
           &Symbols::ClosureParameter(),
-          &Type::ZoneHandle(Type::DynamicType()));
+          &Type::ZoneHandle(I, Type::DynamicType()));
 
       const bool no_explicit_default_values = false;
       ParseFormalParameterList(no_explicit_default_values, false, &func_params);
 
       // The field 'is_static' has no meaning for signature functions.
-      const Function& signature_function = Function::Handle(
+      const Function& signature_function = Function::Handle(isolate(),
           Function::New(*parameter.name,
                         RawFunction::kSignatureFunction,
                         /* is_static = */ false,
@@ -1629,11 +1643,12 @@
                         parameter.name_pos));
       signature_function.set_result_type(result_type);
       AddFormalParamsToFunction(&func_params, signature_function);
-      const String& signature = String::Handle(signature_function.Signature());
+      const String& signature = String::Handle(isolate(),
+                                               signature_function.Signature());
       // Lookup the signature class, i.e. the class whose name is the signature.
       // We only lookup in the current library, but not in its imports, and only
       // create a new canonical signature class if it does not exist yet.
-      Class& signature_class = Class::ZoneHandle(
+      Class& signature_class = Class::ZoneHandle(I,
           library_.LookupLocalClass(signature));
       if (signature_class.IsNull()) {
         signature_class = Class::NewSignatureClass(signature,
@@ -1650,7 +1665,8 @@
         signature_function.set_signature_class(signature_class);
       }
       ASSERT(signature_function.signature_class() == signature_class.raw());
-      Type& signature_type = Type::ZoneHandle(signature_class.SignatureType());
+      Type& signature_type =
+          Type::ZoneHandle(I, signature_class.SignatureType());
       if (!is_top_level_ && !signature_type.IsFinalized()) {
         signature_type ^= ClassFinalizer::FinalizeType(
             signature_class, signature_type, ClassFinalizer::kCanonicalize);
@@ -1789,12 +1805,13 @@
                                       ArgumentListNode* arguments,
                                       bool resolve_getter,
                                       bool* is_no_such_method) {
-  const Class& super_class = Class::Handle(current_class().SuperClass());
+  const Class& super_class = Class::Handle(
+      isolate(), current_class().SuperClass());
   if (super_class.IsNull()) {
     ErrorMsg(token_pos, "class '%s' does not have a superclass",
-             String::Handle(current_class().Name()).ToCString());
+             String::Handle(isolate(), current_class().Name()).ToCString());
   }
-  Function& super_func = Function::Handle(
+  Function& super_func = Function::Handle(isolate(),
       Resolver::ResolveDynamicAnyArgs(super_class, name));
   if (!super_func.IsNull() &&
       !super_func.AreValidArguments(arguments->length(),
@@ -1802,7 +1819,7 @@
                                     NULL)) {
     super_func = Function::null();
   } else if (super_func.IsNull() && resolve_getter) {
-    const String& getter_name = String::ZoneHandle(Field::GetterName(name));
+    const String& getter_name = String::ZoneHandle(I, Field::GetterName(name));
     super_func = Resolver::ResolveDynamicAnyArgs(super_class, getter_name);
     ASSERT(super_func.IsNull() ||
            (super_func.kind() != RawFunction::kImplicitStaticFinalGetter));
@@ -1901,7 +1918,7 @@
 
   const bool kResolveGetter = true;
   bool is_no_such_method = false;
-  const Function& super_function = Function::ZoneHandle(
+  const Function& super_function = Function::ZoneHandle(I,
       GetSuperFunction(supercall_pos,
                        function_name,
                        arguments,
@@ -1909,7 +1926,8 @@
                        &is_no_such_method));
   if (super_function.IsGetterFunction() ||
       super_function.IsImplicitGetterFunction()) {
-    const Class& super_class = Class::ZoneHandle(current_class().SuperClass());
+    const Class& super_class =
+        Class::ZoneHandle(I, current_class().SuperClass());
     AstNode* closure = new StaticGetterNode(supercall_pos,
                                             LoadReceiver(supercall_pos),
                                             /* is_super_getter */ true,
@@ -1944,13 +1962,13 @@
       (op == Token::kBIT_NOT)) {
     // Resolve the operator function in the superclass.
     const String& operator_function_name =
-        String::ZoneHandle(Symbols::New(Token::Str(op)));
+        String::ZoneHandle(I, Symbols::New(Token::Str(op)));
     ArgumentListNode* op_arguments = new ArgumentListNode(super_pos);
     AstNode* receiver = LoadReceiver(super_pos);
     op_arguments->Add(receiver);
     const bool kResolveGetter = false;
     bool is_no_such_method = false;
-    const Function& super_operator = Function::ZoneHandle(
+    const Function& super_operator = Function::ZoneHandle(I,
         GetSuperFunction(super_pos,
                          operator_function_name,
                          op_arguments,
@@ -1978,7 +1996,8 @@
     AstNode* index_expr = ParseExpr(kAllowConst, kConsumeCascades);
     ExpectToken(Token::kRBRACK);
     AstNode* receiver = LoadReceiver(operator_pos);
-    const Class& super_class = Class::ZoneHandle(current_class().SuperClass());
+    const Class& super_class =
+        Class::ZoneHandle(I, current_class().SuperClass());
     ASSERT(!super_class.IsNull());
     super_op =
         new LoadIndexedNode(operator_pos, receiver, index_expr, super_class);
@@ -2004,10 +2023,10 @@
 
     // Resolve the operator function in the superclass.
     const String& operator_function_name =
-        String::ZoneHandle(Symbols::New(Token::Str(op)));
+        String::ZoneHandle(I, Symbols::New(Token::Str(op)));
     const bool kResolveGetter = false;
     bool is_no_such_method = false;
-    const Function& super_operator = Function::ZoneHandle(
+    const Function& super_operator = Function::ZoneHandle(I,
         GetSuperFunction(operator_pos,
                          operator_function_name,
                          op_arguments,
@@ -2030,13 +2049,13 @@
                                                intptr_t token_pos,
                                                AstNode* receiver) {
   Function& implicit_closure_function =
-      Function::ZoneHandle(func.ImplicitClosureFunction());
+      Function::ZoneHandle(I, func.ImplicitClosureFunction());
   if (receiver != NULL) {
     // If we create an implicit instance closure from inside a closure of a
     // parameterized class, make sure that the receiver is captured as
     // instantiator.
     if (current_block_->scope->function_level() > 0) {
-      const Class& signature_class = Class::Handle(
+      const Class& signature_class = Class::Handle(isolate(),
           implicit_closure_function.signature_class());
       if (signature_class.NumTypeParameters() > 0) {
         CaptureInstantiator();
@@ -2050,28 +2069,28 @@
 AstNode* Parser::ParseSuperFieldAccess(const String& field_name,
                                        intptr_t field_pos) {
   TRACE_PARSER("ParseSuperFieldAccess");
-  const Class& super_class = Class::ZoneHandle(current_class().SuperClass());
+  const Class& super_class = Class::ZoneHandle(I, current_class().SuperClass());
   if (super_class.IsNull()) {
     ErrorMsg("class '%s' does not have a superclass",
-             String::Handle(current_class().Name()).ToCString());
+             String::Handle(isolate(), current_class().Name()).ToCString());
   }
   AstNode* implicit_argument = LoadReceiver(field_pos);
 
   const String& getter_name =
-      String::ZoneHandle(Field::GetterName(field_name));
-  const Function& super_getter = Function::ZoneHandle(
+      String::ZoneHandle(I, Field::GetterName(field_name));
+  const Function& super_getter = Function::ZoneHandle(I,
       Resolver::ResolveDynamicAnyArgs(super_class, getter_name));
   if (super_getter.IsNull()) {
     const String& setter_name =
-        String::ZoneHandle(Field::SetterName(field_name));
-    const Function& super_setter = Function::ZoneHandle(
+        String::ZoneHandle(I, Field::SetterName(field_name));
+    const Function& super_setter = Function::ZoneHandle(I,
         Resolver::ResolveDynamicAnyArgs(super_class, setter_name));
     if (super_setter.IsNull()) {
       // Check if this is an access to an implicit closure using 'super'.
       // If a function exists of the specified field_name then try
       // accessing it as a getter, at runtime we will handle this by
       // creating an implicit closure of the function and returning it.
-      const Function& super_function = Function::ZoneHandle(
+      const Function& super_function = Function::ZoneHandle(I,
           Resolver::ResolveDynamicAnyArgs(super_class, field_name));
       if (!super_function.IsNull()) {
         // In case CreateAssignmentNode is called later on this
@@ -2093,16 +2112,16 @@
                                           intptr_t supercall_pos,
                                           LocalVariable* receiver,
                                           ArgumentListNode* forwarding_args) {
-  const Class& super_class = Class::Handle(cls.SuperClass());
+  const Class& super_class = Class::Handle(isolate(), cls.SuperClass());
   // Omit the implicit super() if there is no super class (i.e.
   // we're not compiling class Object), or if the super class is an
   // artificially generated "wrapper class" that has no constructor.
   if (super_class.IsNull() ||
       (super_class.num_native_fields() > 0 &&
-       Class::Handle(super_class.SuperClass()).IsObjectClass())) {
+       Class::Handle(isolate(), super_class.SuperClass()).IsObjectClass())) {
     return;
   }
-  String& super_ctor_name = String::Handle(super_class.Name());
+  String& super_ctor_name = String::Handle(isolate(), super_class.Name());
   super_ctor_name = String::Concat(super_ctor_name, Symbols::Dot());
 
   ArgumentListNode* arguments = new ArgumentListNode(supercall_pos);
@@ -2112,7 +2131,7 @@
   // Implicit construction phase parameter is second argument.
   AstNode* phase_parameter =
       new LiteralNode(supercall_pos,
-                      Smi::ZoneHandle(Smi::New(Function::kCtorPhaseAll)));
+                      Smi::ZoneHandle(I, Smi::New(Function::kCtorPhaseAll)));
   arguments->Add(phase_parameter);
 
   // If this is a super call in a forwarding constructor, add the user-
@@ -2122,8 +2141,8 @@
     for (int i = 0; i < forwarding_args->length(); i++) {
       arguments->Add(forwarding_args->NodeAt(i));
     }
-    String& ctor_name = String::Handle(current_function().name());
-    String& class_name = String::Handle(cls.Name());
+    String& ctor_name = String::Handle(isolate(), current_function().name());
+    String& class_name = String::Handle(isolate(), cls.Name());
     if (ctor_name.Length() > class_name.Length() + 1) {
       // Generating a forwarding call to a named constructor 'C.n'.
       // Add the constructor name 'n' to the super constructor.
@@ -2133,24 +2152,24 @@
   }
 
   // Resolve super constructor function and check arguments.
-  const Function& super_ctor = Function::ZoneHandle(
+  const Function& super_ctor = Function::ZoneHandle(I,
       super_class.LookupConstructor(super_ctor_name));
   if (super_ctor.IsNull()) {
       ErrorMsg(supercall_pos,
                "unresolved implicit call to super constructor '%s()'",
-               String::Handle(super_class.Name()).ToCString());
+               String::Handle(isolate(), super_class.Name()).ToCString());
   }
   if (current_function().is_const() && !super_ctor.is_const()) {
     ErrorMsg(supercall_pos, "implicit call to non-const super constructor");
   }
 
-  String& error_message = String::Handle();
+  String& error_message = String::Handle(isolate());
   if (!super_ctor.AreValidArguments(arguments->length(),
                                     arguments->names(),
                                     &error_message)) {
     ErrorMsg(supercall_pos,
              "invalid arguments passed to super constructor '%s()': %s",
-             String::Handle(super_class.Name()).ToCString(),
+             String::Handle(isolate(), super_class.Name()).ToCString(),
              error_message.ToCString());
   }
   current_block_->statements->Add(
@@ -2164,9 +2183,9 @@
   ASSERT(CurrentToken() == Token::kSUPER);
   const intptr_t supercall_pos = TokenPos();
   ConsumeToken();
-  const Class& super_class = Class::Handle(cls.SuperClass());
+  const Class& super_class = Class::Handle(isolate(), cls.SuperClass());
   ASSERT(!super_class.IsNull());
-  String& ctor_name = String::Handle(super_class.Name());
+  String& ctor_name = String::Handle(isolate(), super_class.Name());
   ctor_name = String::Concat(ctor_name, Symbols::Dot());
   if (CurrentToken() == Token::kPERIOD) {
     ConsumeToken();
@@ -2185,7 +2204,7 @@
   // super initializer.
   AstNode* phase_parameter =
       new LiteralNode(supercall_pos,
-                      Smi::ZoneHandle(Smi::New(Function::kCtorPhaseAll)));
+                      Smi::ZoneHandle(I, Smi::New(Function::kCtorPhaseAll)));
   arguments->Add(phase_parameter);
   // 'this' parameter must not be accessible to the other super call arguments.
   receiver->set_invisible(true);
@@ -2193,7 +2212,7 @@
   receiver->set_invisible(false);
 
   // Resolve the constructor.
-  const Function& super_ctor = Function::ZoneHandle(
+  const Function& super_ctor = Function::ZoneHandle(I,
       super_class.LookupConstructor(ctor_name));
   if (super_ctor.IsNull()) {
     ErrorMsg(supercall_pos,
@@ -2203,7 +2222,7 @@
   if (current_function().is_const() && !super_ctor.is_const()) {
     ErrorMsg(supercall_pos, "super constructor must be const");
   }
-  String& error_message = String::Handle();
+  String& error_message = String::Handle(isolate());
   if (!super_ctor.AreValidArguments(arguments->length(),
                                     arguments->names(),
                                     &error_message)) {
@@ -2241,7 +2260,7 @@
     ErrorMsg(field_pos,
              "initializer expression must be compile time constant.");
   }
-  Field& field = Field::ZoneHandle(cls.LookupInstanceField(field_name));
+  Field& field = Field::ZoneHandle(I, cls.LookupInstanceField(field_name));
   if (field.IsNull()) {
     ErrorMsg(field_pos, "unresolved reference to instance field '%s'",
              field_name.ToCString());
@@ -2254,8 +2273,8 @@
 
 
 void Parser::CheckFieldsInitialized(const Class& cls) {
-  const Array& fields = Array::Handle(cls.fields());
-  Field& field = Field::Handle();
+  const Array& fields = Array::Handle(isolate(), cls.fields());
+  Field& field = Field::Handle(isolate());
   SequenceNode* initializers = current_block_->statements;
   for (int field_num = 0; field_num < fields.Length(); field_num++) {
     field ^= fields.At(field_num);
@@ -2278,7 +2297,7 @@
 
     if (found) continue;
 
-    field.UpdateGuardedCidAndLength(Object::Handle());
+    field.UpdateGuardedCidAndLength(Object::Handle(isolate()));
   }
 }
 
@@ -2288,14 +2307,15 @@
   // from a different class. We need to save and restore current
   // class, library, and token stream (script).
   ASSERT(current_class().raw() != field.origin());
-  const Class& saved_class = Class::Handle(current_class().raw());
-  const Library& saved_library = Library::Handle(library().raw());
-  const Script& saved_script = Script::Handle(script().raw());
+  const Class& saved_class = Class::Handle(isolate(), current_class().raw());
+  const Library& saved_library = Library::Handle(isolate(), library().raw());
+  const Script& saved_script = Script::Handle(isolate(), script().raw());
   const intptr_t saved_token_pos = TokenPos();
 
-  set_current_class(Class::Handle(field.origin()));
-  set_library(Library::Handle(current_class().library()));
-  SetScript(Script::Handle(current_class().script()), field.token_pos());
+  set_current_class(Class::Handle(isolate(), field.origin()));
+  set_library(Library::Handle(isolate(), current_class().library()));
+  SetScript(Script::Handle(isolate(), current_class().script()),
+            field.token_pos());
 
   ASSERT(IsIdentifier());
   ConsumeToken();
@@ -2323,13 +2343,13 @@
                  LocalVariable* receiver,
                  GrowableArray<Field*>* initialized_fields) {
   TRACE_PARSER("ParseInitializedInstanceFields");
-  const Array& fields = Array::Handle(cls.fields());
-  Field& f = Field::Handle();
+  const Array& fields = Array::Handle(isolate(), cls.fields());
+  Field& f = Field::Handle(isolate());
   const intptr_t saved_pos = TokenPos();
   for (int i = 0; i < fields.Length(); i++) {
     f ^= fields.At(i);
     if (!f.is_static() && f.has_initializer()) {
-      Field& field = Field::ZoneHandle();
+      Field& field = Field::ZoneHandle(I);
       field ^= fields.At(i);
       if (field.is_final()) {
         // Final fields with initializer expression may not be initialized
@@ -2380,7 +2400,7 @@
     if (initialized_field->raw() == field->raw()) {
       ErrorMsg(init_pos,
                "duplicate initialization for field %s",
-               String::Handle(field->name()).ToCString());
+               String::Handle(isolate(), field->name()).ToCString());
     }
   }
   initialized_fields->Add(field);
@@ -2424,7 +2444,7 @@
   ASSERT(CurrentToken() == Token::kTHIS);
   const intptr_t call_pos = TokenPos();
   ConsumeToken();
-  String& ctor_name = String::Handle(cls.Name());
+  String& ctor_name = String::Handle(isolate(), cls.Name());
 
   ctor_name = String::Concat(ctor_name, Symbols::Dot());
   if (CurrentToken() == Token::kPERIOD) {
@@ -2447,12 +2467,12 @@
   ParseActualParameters(arguments, kAllowConst);
   receiver->set_invisible(false);
   // Resolve the constructor.
-  const Function& redirect_ctor = Function::ZoneHandle(
+  const Function& redirect_ctor = Function::ZoneHandle(I,
       cls.LookupConstructor(ctor_name));
   if (redirect_ctor.IsNull()) {
     ErrorMsg(call_pos, "constructor '%s' not found", ctor_name.ToCString());
   }
-  String& error_message = String::Handle();
+  String& error_message = String::Handle(isolate());
   if (!redirect_ctor.AreValidArguments(arguments->length(),
                                        arguments->names(),
                                        &error_message)) {
@@ -2479,7 +2499,7 @@
   LocalVariable* phase_parameter =
       new LocalVariable(Scanner::kNoSourcePos,
                         Symbols::PhaseParameter(),
-                        Type::ZoneHandle(Type::SmiType()));
+                        Type::ZoneHandle(I, Type::SmiType()));
   current_block_->scope->InsertParameterAt(1, phase_parameter);
 
   // Parse expressions of instance fields that have an explicit
@@ -2519,8 +2539,8 @@
     for (int i = 2; i < func.NumParameters(); i++) {
       LocalVariable* param = new LocalVariable(
           Scanner::kNoSourcePos,
-          String::ZoneHandle(func.ParameterNameAt(i)),
-          Type::ZoneHandle(Type::DynamicType()));
+          String::ZoneHandle(I, func.ParameterNameAt(i)),
+          Type::ZoneHandle(I, Type::DynamicType()));
       current_block_->scope->InsertParameterAt(i, param);
       forwarding_args->Add(new LoadLocalNode(Scanner::kNoSourcePos, param));
     }
@@ -2541,12 +2561,12 @@
 
 void Parser::CheckRecursiveInvocation() {
   const GrowableObjectArray& pending_functions =
-      GrowableObjectArray::Handle(
+      GrowableObjectArray::Handle(isolate(),
           isolate()->object_store()->pending_functions());
   for (int i = 0; i < pending_functions.Length(); i++) {
     if (pending_functions.At(i) == current_function().raw()) {
       const String& fname =
-          String::Handle(current_function().UserVisibleName());
+          String::Handle(isolate(), current_function().UserVisibleName());
       ErrorMsg("circular dependency for function %s", fname.ToCString());
     }
   }
@@ -2565,7 +2585,7 @@
   ASSERT(!func.IsFactory());
   ASSERT(!func.is_static());
   ASSERT(!func.IsLocalFunction());
-  const Class& cls = Class::Handle(func.Owner());
+  const Class& cls = Class::Handle(isolate(), func.Owner());
   ASSERT(!cls.IsNull());
 
   CheckRecursiveInvocation();
@@ -2594,7 +2614,7 @@
   params.AddFinalParameter(
       TokenPos(),
       &Symbols::PhaseParameter(),
-      &Type::ZoneHandle(Type::SmiType()));
+      &Type::ZoneHandle(I, Type::SmiType()));
 
   if (func.is_const()) {
     params.SetImplicitlyFinal();
@@ -2602,7 +2622,7 @@
   ParseFormalParameterList(allow_explicit_default_values, false, &params);
 
   SetupDefaultsForOptionalParams(&params, default_parameter_values);
-  ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
   ASSERT(func.NumParameters() == params.parameters->length());
 
   // Now populate function scope with the formal parameters.
@@ -2641,7 +2661,8 @@
       ParamDesc& param = (*params.parameters)[i];
       if (param.is_field_initializer) {
         const String& field_name = *param.name;
-        Field& field = Field::ZoneHandle(cls.LookupInstanceField(field_name));
+        Field& field =
+            Field::ZoneHandle(I, cls.LookupInstanceField(field_name));
         if (field.IsNull()) {
           ErrorMsg(param.name_pos,
                    "unresolved reference to instance field '%s'",
@@ -2656,7 +2677,7 @@
 
         if (!param.has_explicit_type) {
           const AbstractType& field_type =
-              AbstractType::ZoneHandle(field.type());
+              AbstractType::ZoneHandle(I, field.type());
           param.type = &field_type;
           // Parameter type was already set to dynamic when parsing the class
           // declaration: fix it.
@@ -2698,13 +2719,13 @@
     AstNode* phase_check = new BinaryOpNode(
         Scanner::kNoSourcePos, Token::kBIT_AND, phase_value,
         new LiteralNode(Scanner::kNoSourcePos,
-                        Smi::ZoneHandle(Smi::New(Function::kCtorPhaseInit))));
+            Smi::ZoneHandle(I, Smi::New(Function::kCtorPhaseInit))));
     AstNode* comparison =
         new ComparisonNode(Scanner::kNoSourcePos,
                            Token::kNE_STRICT,
                            phase_check,
                            new LiteralNode(TokenPos(),
-                                           Smi::ZoneHandle(Smi::New(0))));
+                                           Smi::ZoneHandle(I, Smi::New(0))));
     AstNode* guarded_init_statements =
         new IfNode(Scanner::kNoSourcePos,
                    comparison,
@@ -2766,17 +2787,15 @@
     ArgumentListNode* initializer_args = super_call->arguments();
     const Function& super_ctor = super_call->function();
     // Patch the initializer call so it only executes the super initializer.
-    initializer_args->SetNodeAt(1,
-        new LiteralNode(body_pos,
-                        Smi::ZoneHandle(Smi::New(Function::kCtorPhaseInit))));
+    initializer_args->SetNodeAt(1, new LiteralNode(
+        body_pos, Smi::ZoneHandle(I, Smi::New(Function::kCtorPhaseInit))));
 
     ArgumentListNode* super_call_args = new ArgumentListNode(body_pos);
     // First argument is the receiver.
     super_call_args->Add(new LoadLocalNode(body_pos, receiver));
     // Second argument is the construction phase argument.
-    AstNode* phase_parameter =
-        new LiteralNode(body_pos,
-                        Smi::ZoneHandle(Smi::New(Function::kCtorPhaseBody)));
+    AstNode* phase_parameter = new(I) LiteralNode(
+        body_pos, Smi::ZoneHandle(I, Smi::New(Function::kCtorPhaseBody)));
     super_call_args->Add(phase_parameter);
     super_call_args->set_names(initializer_args->names());
     for (int i = 2; i < initializer_args->length(); i++) {
@@ -2854,7 +2873,7 @@
                                 Array* default_parameter_values) {
   TRACE_PARSER("ParseFunc");
   Function& saved_innermost_function =
-      Function::Handle(innermost_function().raw());
+      Function::Handle(isolate(), innermost_function().raw());
   innermost_function_ = func.raw();
 
   // Save current try index. Try index starts at zero for each function.
@@ -2882,7 +2901,7 @@
     params.AddFinalParameter(
         TokenPos(),
         &Symbols::ClosureParameter(),
-        &Type::ZoneHandle(Type::DynamicType()));
+        &Type::ZoneHandle(I, Type::DynamicType()));
   } else if (!func.is_static()) {
     // Static functions do not have a receiver.
     ASSERT(current_class().raw() == func.Owner());
@@ -2893,7 +2912,7 @@
     params.AddFinalParameter(
         TokenPos(),
         &Symbols::TypeArgumentsParameter(),
-        &Type::ZoneHandle(Type::DynamicType()));
+        &Type::ZoneHandle(I, Type::DynamicType()));
   }
   ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction());
   const bool allow_explicit_default_values = true;
@@ -2910,7 +2929,7 @@
       AddFormalParamsToFunction(&params, func);
     }
     SetupDefaultsForOptionalParams(&params, default_parameter_values);
-    ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
+    ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
     ASSERT(func.NumParameters() == params.parameters->length());
 
     // Check whether the function has any field initializer formal parameters,
@@ -2945,8 +2964,9 @@
   intptr_t end_token_pos = 0;
   if (CurrentToken() == Token::kLBRACE) {
     ConsumeToken();
-    if (String::Handle(func.name()).Equals(Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(func.Owner());
+    if (String::Handle(isolate(), func.name()).Equals(
+        Symbols::EqualOperator())) {
+      const Class& owner = Class::Handle(isolate(), func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -2956,8 +2976,9 @@
     ExpectToken(Token::kRBRACE);
   } else if (CurrentToken() == Token::kARROW) {
     ConsumeToken();
-    if (String::Handle(func.name()).Equals(Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(func.Owner());
+    if (String::Handle(isolate(), func.name()).Equals(
+        Symbols::EqualOperator())) {
+      const Class& owner = Class::Handle(isolate(), func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -2968,8 +2989,9 @@
     current_block_->statements->Add(new ReturnNode(expr_pos, expr));
     end_token_pos = TokenPos();
   } else if (IsLiteral("native")) {
-    if (String::Handle(func.name()).Equals(Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(func.Owner());
+    if (String::Handle(isolate(), func.name()).Equals(
+        Symbols::EqualOperator())) {
+      const Class& owner = Class::Handle(isolate(), func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -2979,19 +3001,17 @@
     ExpectSemicolon();
   } else if (func.is_external()) {
     // Body of an external method contains a single throw.
-    const String& function_name = String::ZoneHandle(func.name());
-    // TODO(regis): For an instance function, pass the receiver to
-    // NoSuchMethodError.
+    const String& function_name = String::ZoneHandle(I, func.name());
     current_block_->statements->Add(
         ThrowNoSuchMethodError(TokenPos(),
                                current_class(),
                                function_name,
-                               NULL,   // No arguments.
+                               NULL,  // Ignore arguments.
                                func.is_static() ?
                                    InvocationMirror::kStatic :
                                    InvocationMirror::kDynamic,
                                InvocationMirror::kMethod,
-                               NULL));  // No existing function.
+                               &func));  // Unpatched external function.
     end_token_pos = TokenPos();
   } else {
     UnexpectedToken();
@@ -3013,7 +3033,7 @@
       new LoadLocalNode(Scanner::kNoSourcePos,
                         current_block_->scope->parent()->VariableAt(1));
   LiteralNode* null_operand =
-      new LiteralNode(Scanner::kNoSourcePos, Instance::ZoneHandle());
+      new LiteralNode(Scanner::kNoSourcePos, Instance::ZoneHandle(I));
   ComparisonNode* check_arg =
       new ComparisonNode(Scanner::kNoSourcePos,
                          Token::kEQ_STRICT,
@@ -3043,16 +3063,18 @@
 
 // Skips tokens up to matching closing parenthesis.
 void Parser::SkipToMatchingParenthesis() {
-  ASSERT(CurrentToken() == Token::kLPAREN);
+  Token::Kind current_token = CurrentToken();
+  ASSERT(current_token == Token::kLPAREN);
   int level = 0;
   do {
-    if (CurrentToken() == Token::kLPAREN) {
+    if (current_token == Token::kLPAREN) {
       level++;
-    } else if (CurrentToken() == Token::kRPAREN) {
+    } else if (current_token == Token::kRPAREN) {
       level--;
     }
     ConsumeToken();
-  } while ((level > 0) && (CurrentToken() != Token::kEOS));
+    current_token = CurrentToken();
+  } while ((level > 0) && (current_token != Token::kEOS));
 }
 
 
@@ -3095,13 +3117,14 @@
         !ResolveIdentInLocalScope(qual_ident->ident_pos,
                                   *(qual_ident->ident),
                                   NULL)) {
-      LibraryPrefix& lib_prefix = LibraryPrefix::ZoneHandle();
+      LibraryPrefix& lib_prefix = LibraryPrefix::ZoneHandle(I);
       if (!current_class().IsMixinApplication()) {
         lib_prefix = current_class().LookupLibraryPrefix(*(qual_ident->ident));
       } else {
         // TODO(hausner): Should we resolve the prefix via the library scope
         // rather than via the class?
-        Class& cls = Class::Handle(parsed_function()->function().origin());
+        Class& cls = Class::Handle(isolate(),
+                                   parsed_function()->function().origin());
         lib_prefix = cls.LookupLibraryPrefix(*(qual_ident->ident));
       }
       if (!lib_prefix.IsNull()) {
@@ -3164,14 +3187,14 @@
     method->params.AddFinalParameter(
         formal_param_pos,
         &Symbols::TypeArgumentsParameter(),
-        &Type::ZoneHandle(Type::DynamicType()));
+        &Type::ZoneHandle(I, Type::DynamicType()));
   }
   // Constructors have an implicit parameter for the construction phase.
   if (method->IsConstructor()) {
     method->params.AddFinalParameter(
         TokenPos(),
         &Symbols::PhaseParameter(),
-        &Type::ZoneHandle(Type::SmiType()));
+        &Type::ZoneHandle(I, Type::SmiType()));
   }
   if (are_implicitly_final) {
     method->params.SetImplicitlyFinal();
@@ -3202,13 +3225,13 @@
     if (method->IsGetter()) {
       expected_num_parameters = (method->has_static) ? 0 : 1;
       method->dict_name = method->name;
-      method->name = &String::ZoneHandle(Field::GetterSymbol(*method->name));
+      method->name = &String::ZoneHandle(I, Field::GetterSymbol(*method->name));
     } else {
       ASSERT(method->IsSetter());
       expected_num_parameters = (method->has_static) ? 1 : 2;
-      method->dict_name =
-          &String::ZoneHandle(String::Concat(*method->name, Symbols::Equals()));
-      method->name = &String::ZoneHandle(Field::SetterSymbol(*method->name));
+      method->dict_name = &String::ZoneHandle(I,
+          String::Concat(*method->name, Symbols::Equals()));
+      method->name = &String::ZoneHandle(I, Field::SetterSymbol(*method->name));
     }
     if ((method->params.num_fixed_parameters != expected_num_parameters) ||
         (method->params.num_optional_parameters != 0)) {
@@ -3218,8 +3241,8 @@
   }
 
   // Parse redirecting factory constructor.
-  Type& redirection_type = Type::Handle();
-  String& redirection_identifier = String::Handle();
+  Type& redirection_type = Type::Handle(isolate());
+  String& redirection_identifier = String::Handle(isolate());
   bool is_redirecting = false;
   if (method->IsFactory() && (CurrentToken() == Token::kASSIGN)) {
     // Default parameter values are disallowed in redirecting factories.
@@ -3231,17 +3254,17 @@
     ConsumeToken();
     const intptr_t type_pos = TokenPos();
     is_redirecting = true;
-    const AbstractType& type = AbstractType::Handle(
+    const AbstractType& type = AbstractType::Handle(isolate(),
         ParseType(ClassFinalizer::kResolveTypeParameters));
     if (!type.IsMalformed() && type.IsTypeParameter()) {
       // Replace the type with a malformed type and compile a throw when called.
       redirection_type = ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(),  // No previous error.
+          Error::Handle(isolate()),  // No previous error.
           script_,
           type_pos,
           "factory '%s' may not redirect to type parameter '%s'",
           method->name->ToCString(),
-          String::Handle(type.UserVisibleName()).ToCString());
+          String::Handle(isolate(), type.UserVisibleName()).ToCString());
     } else {
       // We handle malformed and malbounded redirection type at run time.
       redirection_type ^= type.raw();
@@ -3269,7 +3292,7 @@
       }
       ConsumeToken();  // Colon.
       ExpectToken(Token::kTHIS);
-      String& redir_name = String::ZoneHandle(
+      String& redir_name = String::ZoneHandle(I,
           String::Concat(members->class_name(), Symbols::Dot()));
       if (CurrentToken() == Token::kPERIOD) {
         ConsumeToken();
@@ -3387,7 +3410,7 @@
   } else {
     function_kind = RawFunction::kRegularFunction;
   }
-  Function& func = Function::Handle(
+  Function& func = Function::Handle(isolate(),
       Function::New(*method->name,
                     function_kind,
                     method->has_static,
@@ -3453,10 +3476,10 @@
   if (!field->has_static && field->has_const) {
     ErrorMsg(field->name_pos, "instance field may not be 'const'");
   }
-  Function& getter = Function::Handle();
-  Function& setter = Function::Handle();
-  Field& class_field = Field::ZoneHandle();
-  Instance& init_value = Instance::Handle();
+  Function& getter = Function::Handle(isolate());
+  Function& setter = Function::Handle(isolate());
+  Field& class_field = Field::ZoneHandle(I);
+  Instance& init_value = Instance::Handle(isolate());
   while (true) {
     bool has_initializer = CurrentToken() == Token::kASSIGN;
     bool has_simple_literal = false;
@@ -3510,7 +3533,8 @@
     if (field->has_static && has_initializer) {
       class_field.set_value(init_value);
       if (!has_simple_literal) {
-        String& getter_name = String::Handle(Field::GetterSymbol(*field->name));
+        String& getter_name = String::Handle(isolate(),
+                                             Field::GetterSymbol(*field->name));
         getter = Function::New(getter_name,
                                RawFunction::kImplicitStaticFinalGetter,
                                field->has_static,
@@ -3525,7 +3549,7 @@
 
         // Create initializer function for non-const fields.
         if (!class_field.is_const()) {
-          const Function& init_function = Function::ZoneHandle(
+          const Function& init_function = Function::ZoneHandle(I,
               Function::NewStaticInitializer(class_field));
           members->AddFunction(init_function);
         }
@@ -3534,7 +3558,8 @@
 
     // For instance fields, we create implicit getter and setter methods.
     if (!field->has_static) {
-      String& getter_name = String::Handle(Field::GetterSymbol(*field->name));
+      String& getter_name = String::Handle(isolate(),
+                                           Field::GetterSymbol(*field->name));
       getter = Function::New(getter_name, RawFunction::kImplicitGetter,
                              field->has_static,
                              field->has_final,
@@ -3551,7 +3576,8 @@
       members->AddFunction(getter);
       if (!field->has_final) {
         // Build a setter accessor for non-const fields.
-        String& setter_name = String::Handle(Field::SetterSymbol(*field->name));
+        String& setter_name = String::Handle(isolate(),
+                                             Field::SetterSymbol(*field->name));
         setter = Function::New(setter_name, RawFunction::kImplicitSetter,
                                field->has_static,
                                field->has_final,
@@ -3566,7 +3592,7 @@
         params.AddFinalParameter(TokenPos(),
                                  &Symbols::Value(),
                                  field->type);
-        setter.set_result_type(Type::Handle(Type::VoidType()));
+        setter.set_result_type(Type::Handle(isolate(), Type::VoidType()));
         AddFormalParamsToFunction(&params, setter);
         members->AddFunction(setter);
       }
@@ -3666,7 +3692,7 @@
     ConsumeToken();
     member.has_var = true;
     // The member type is the 'dynamic' type.
-    member.type = &Type::ZoneHandle(Type::DynamicType());
+    member.type = &Type::ZoneHandle(I, Type::DynamicType());
   } else if (CurrentToken() == Token::kFACTORY) {
     ConsumeToken();
     if (member.has_static) {
@@ -3683,7 +3709,7 @@
     }
     ConsumeToken();
     ASSERT(member.type == NULL);
-    member.type = &Type::ZoneHandle(Type::VoidType());
+    member.type = &Type::ZoneHandle(I, Type::VoidType());
   } else if (CurrentToken() == Token::kIDENT) {
     // This is either a type name or the name of a method/constructor/field.
     if ((member.type == NULL) && !member.has_factory) {
@@ -3703,7 +3729,7 @@
         // The declared type of fields is never ignored, even in unchecked mode,
         // because getters and setters could be closurized at some time (not
         // supported yet).
-        member.type = &AbstractType::ZoneHandle(
+        member.type = &AbstractType::ZoneHandle(I,
             ParseType(ClassFinalizer::kResolveTypeParameters));
       }
     }
@@ -3730,16 +3756,16 @@
     }
     // Do not bypass class resolution by using current_class() directly, since
     // it may be a patch class.
-    const Object& result_type_class = Object::Handle(
-        UnresolvedClass::New(LibraryPrefix::Handle(),
+    const Object& result_type_class = Object::Handle(isolate(),
+        UnresolvedClass::New(LibraryPrefix::Handle(isolate()),
                              *member.name,
                              member.name_pos));
     // The type arguments of the result type are the type parameters of the
     // current class. Note that in the case of a patch class, they are copied
     // from the class being patched.
-    member.type = &Type::ZoneHandle(Type::New(
+    member.type = &Type::ZoneHandle(I, Type::New(
         result_type_class,
-        TypeArguments::Handle(current_class().type_parameters()),
+        TypeArguments::Handle(isolate(), current_class().type_parameters()),
         member.name_pos));
 
     // We must be dealing with a constructor or named constructor.
@@ -3778,7 +3804,7 @@
     // The grammar allows a return type, so member.type is not always NULL here.
     // If no return type is specified, the return type of the setter is dynamic.
     if (member.type == NULL) {
-      member.type = &Type::ZoneHandle(Type::DynamicType());
+      member.type = &Type::ZoneHandle(I, Type::DynamicType());
     }
   } else if ((CurrentToken() == Token::kOPERATOR) && !member.has_var &&
              (LookaheadToken(1) != Token::kLPAREN) &&
@@ -3797,7 +3823,7 @@
     member.kind = RawFunction::kRegularFunction;
     member.name_pos = this->TokenPos();
     member.name =
-        &String::ZoneHandle(Symbols::New(Token::Str(member.operator_token)));
+        &String::ZoneHandle(I, Symbols::New(Token::Str(member.operator_token)));
     ConsumeToken();
   } else if (IsIdentifier()) {
     member.name = CurrentLiteral();
@@ -3811,7 +3837,7 @@
   if (CurrentToken() == Token::kLPAREN || member.IsGetter()) {
     // Constructor or method.
     if (member.type == NULL) {
-      member.type = &Type::ZoneHandle(Type::DynamicType());
+      member.type = &Type::ZoneHandle(I, Type::DynamicType());
     }
     ASSERT(member.IsFactory() == member.has_factory);
     ParseMethodOrConstructor(members, &member);
@@ -3825,7 +3851,7 @@
     }
     if (member.type == NULL) {
       if (member.has_final) {
-        member.type = &Type::ZoneHandle(Type::DynamicType());
+        member.type = &Type::ZoneHandle(I, Type::DynamicType());
       } else {
         ErrorMsg("missing 'var', 'final', 'const' or type"
                  " in field declaration");
@@ -3862,9 +3888,10 @@
   if (FLAG_trace_parser) {
     OS::Print("TopLevel parsing class '%s'\n", class_name.ToCString());
   }
-  Class& cls = Class::Handle();
-  TypeArguments& orig_type_parameters = TypeArguments::Handle();
-  Object& obj = Object::Handle(library_.LookupLocalObject(class_name));
+  Class& cls = Class::Handle(isolate());
+  TypeArguments& orig_type_parameters = TypeArguments::Handle(isolate());
+  Object& obj = Object::Handle(isolate(),
+                               library_.LookupLocalObject(class_name));
   if (obj.IsNull()) {
     if (is_patch) {
       ErrorMsg(classname_pos, "missing class '%s' cannot be patched",
@@ -3908,7 +3935,7 @@
   if (is_patch) {
     // Check that the new type parameters are identical to the original ones.
     const TypeArguments& new_type_parameters =
-        TypeArguments::Handle(cls.type_parameters());
+        TypeArguments::Handle(isolate(), cls.type_parameters());
     const int new_type_params_count =
         new_type_parameters.IsNull() ? 0 : new_type_parameters.Length();
     const int orig_type_params_count =
@@ -3918,10 +3945,12 @@
                "class '%s' must be patched with identical type parameters",
                class_name.ToCString());
     }
-    TypeParameter& new_type_param = TypeParameter::Handle();
-    TypeParameter& orig_type_param = TypeParameter::Handle();
-    String& new_name = String::Handle();
-    String& orig_name = String::Handle();
+    TypeParameter& new_type_param = TypeParameter::Handle(isolate());
+    TypeParameter& orig_type_param = TypeParameter::Handle(isolate());
+    String& new_name = String::Handle(isolate());
+    String& orig_name = String::Handle(isolate());
+    AbstractType& new_bound = AbstractType::Handle(isolate());
+    AbstractType& orig_bound = AbstractType::Handle(isolate());
     for (int i = 0; i < new_type_params_count; i++) {
       new_type_param ^= new_type_parameters.TypeAt(i);
       orig_type_param ^= orig_type_parameters.TypeAt(i);
@@ -3935,8 +3964,17 @@
                  class_name.ToCString(),
                  orig_name.ToCString());
       }
-      // We do not check that the bounds are repeated. We use the original ones.
-      // TODO(regis): Should we check?
+      new_bound = new_type_param.bound();
+      orig_bound = orig_type_param.bound();
+      if (!new_bound.Equals(orig_bound)) {
+        ErrorMsg(new_type_param.token_pos(),
+                 "bound '%s' of type parameter '%s' of patch class '%s' does "
+                 "not match original type parameter bound '%s'",
+                 String::Handle(new_bound.UserVisibleName()).ToCString(),
+                 new_name.ToCString(),
+                 class_name.ToCString(),
+                 String::Handle(orig_bound.UserVisibleName()).ToCString());
+      }
     }
     cls.set_type_parameters(orig_type_parameters);
   }
@@ -3955,13 +3993,13 @@
              class_name.ToCString());
   }
 
-  AbstractType& super_type = Type::Handle();
+  AbstractType& super_type = Type::Handle(isolate());
   if ((CurrentToken() == Token::kEXTENDS) || is_mixin_declaration) {
     ConsumeToken();  // extends or =
     const intptr_t type_pos = TokenPos();
     super_type = ParseType(ClassFinalizer::kResolveTypeParameters);
     if (super_type.IsMalformedOrMalbounded()) {
-      ErrorMsg(Error::Handle(super_type.error()));
+      ErrorMsg(Error::Handle(isolate(), super_type.error()));
     }
     if (super_type.IsDynamicType()) {
       // Unlikely here, since super type is not resolved yet.
@@ -3973,7 +4011,8 @@
       ErrorMsg(type_pos,
                "class '%s' may not extend type parameter '%s'",
                class_name.ToCString(),
-               String::Handle(super_type.UserVisibleName()).ToCString());
+               String::Handle(isolate(),
+                              super_type.UserVisibleName()).ToCString());
     }
     // The class finalizer will check whether the super type is malbounded.
     if (is_mixin_declaration) {
@@ -4025,7 +4064,7 @@
   CompilerStats::num_classes_compiled++;
   set_current_class(cls);
   is_top_level_ = true;
-  String& class_name = String::Handle(cls.Name());
+  String& class_name = String::Handle(isolate(), cls.Name());
   const intptr_t class_pos = TokenPos();
   ClassDesc members(cls, class_name, false, class_pos);
   while (CurrentToken() != Token::kLBRACE) {
@@ -4048,7 +4087,8 @@
   cls.AddFields(members.fields());
 
   // Creating a new array for functions marks the class as parsed.
-  const Array& array = Array::Handle(Array::MakeArray(members.functions()));
+  const Array& array = Array::Handle(isolate(),
+                                     Array::MakeArray(members.functions()));
   cls.SetFunctions(array);
 
   // Add an implicit constructor if no explicit constructor is present.
@@ -4059,11 +4099,12 @@
 
   if (cls.is_patch()) {
     // Apply the changes to the patched class looked up above.
-    Object& obj = Object::Handle(library_.LookupLocalObject(class_name));
+    Object& obj = Object::Handle(isolate(),
+                                 library_.LookupLocalObject(class_name));
     // The patched class must not be finalized yet.
     const Class& orig_class = Class::Cast(obj);
     ASSERT(!orig_class.is_finalized());
-    Error& error = Error::Handle();
+    Error& error = Error::Handle(isolate());
     if (!orig_class.ApplyPatch(cls, &error)) {
       AppendErrorMsg(error, class_pos, "applying patch failed");
     }
@@ -4074,13 +4115,13 @@
 // Add an implicit constructor to the given class.
 void Parser::AddImplicitConstructor(const Class& cls) {
   // The implicit constructor is unnamed, has no explicit parameter.
-  String& ctor_name = String::ZoneHandle(cls.Name());
+  String& ctor_name = String::ZoneHandle(I, cls.Name());
   ctor_name = String::Concat(ctor_name, Symbols::Dot());
   ctor_name = Symbols::New(ctor_name);
   // To indicate that this is an implicit constructor, we set the
   // token position and end token position of the function
   // to the token position of the class.
-  Function& ctor = Function::Handle(
+  Function& ctor = Function::Handle(isolate(),
       Function::New(ctor_name,
                     RawFunction::kConstructor,
                     /* is_static = */ false,
@@ -4102,7 +4143,7 @@
   // Add implicit parameter for construction phase.
   params.AddFinalParameter(cls.token_pos(),
                            &Symbols::PhaseParameter(),
-                           &Type::ZoneHandle(Type::SmiType()));
+                           &Type::ZoneHandle(I, Type::SmiType()));
 
   AddFormalParamsToFunction(&params, ctor);
   // The body of the constructor cannot modify the type of the constructed
@@ -4154,13 +4195,14 @@
     OS::Print("toplevel parsing mixin application alias class '%s'\n",
               class_name.ToCString());
   }
-  const Object& obj = Object::Handle(library_.LookupLocalObject(class_name));
+  const Object& obj = Object::Handle(isolate(),
+                                     library_.LookupLocalObject(class_name));
   if (!obj.IsNull()) {
     ErrorMsg(classname_pos, "'%s' is already defined",
              class_name.ToCString());
   }
   const Class& mixin_application =
-      Class::Handle(Class::New(class_name, script_, classname_pos));
+      Class::Handle(isolate(), Class::New(class_name, script_, classname_pos));
   mixin_application.set_is_mixin_app_alias();
   library_.AddClass(mixin_application);
   set_current_class(mixin_application);
@@ -4175,12 +4217,13 @@
 
   const intptr_t type_pos = TokenPos();
   AbstractType& type =
-      AbstractType::Handle(ParseType(ClassFinalizer::kResolveTypeParameters));
+      AbstractType::Handle(isolate(),
+                           ParseType(ClassFinalizer::kResolveTypeParameters));
   if (type.IsTypeParameter()) {
     ErrorMsg(type_pos,
              "class '%s' may not extend type parameter '%s'",
              class_name.ToCString(),
-             String::Handle(type.UserVisibleName()).ToCString());
+             String::Handle(isolate(), type.UserVisibleName()).ToCString());
   }
 
   CheckToken(Token::kWITH, "mixin application 'with Type' expected");
@@ -4258,7 +4301,7 @@
   }
 
   // Parse the result type of the function type.
-  AbstractType& result_type = Type::Handle(Type::DynamicType());
+  AbstractType& result_type = Type::Handle(isolate(), Type::DynamicType());
   if (CurrentToken() == Token::kVOID) {
     ConsumeToken();
     result_type = Type::VoidType();
@@ -4274,7 +4317,8 @@
 
   // Lookup alias name and report an error if it is already defined in
   // the library scope.
-  const Object& obj = Object::Handle(library_.LookupLocalObject(*alias_name));
+  const Object& obj = Object::Handle(isolate(),
+                                     library_.LookupLocalObject(*alias_name));
   if (!obj.IsNull()) {
     ErrorMsg(alias_name_pos,
              "'%s' is already defined", alias_name->ToCString());
@@ -4284,9 +4328,9 @@
   // signature function after it has been parsed. The type parameters, in order
   // to be properly finalized, need to be associated to this signature class as
   // they are parsed.
-  const Class& function_type_alias = Class::Handle(
+  const Class& function_type_alias = Class::Handle(isolate(),
       Class::NewSignatureClass(*alias_name,
-                               Function::Handle(),
+                               Function::Handle(isolate()),
                                script_,
                                alias_name_pos));
   library_.AddClass(function_type_alias);
@@ -4308,13 +4352,13 @@
   func_params.AddFinalParameter(
       TokenPos(),
       &Symbols::ClosureParameter(),
-      &Type::ZoneHandle(Type::DynamicType()));
+      &Type::ZoneHandle(I, Type::DynamicType()));
 
   const bool no_explicit_default_values = false;
   ParseFormalParameterList(no_explicit_default_values, false, &func_params);
   ExpectSemicolon();
   // The field 'is_static' has no meaning for signature functions.
-  Function& signature_function = Function::Handle(
+  Function& signature_function = Function::Handle(isolate(),
       Function::New(*alias_name,
                     RawFunction::kSignatureFunction,
                     /* is_static = */ false,
@@ -4330,7 +4374,8 @@
   // Patch the signature function in the signature class.
   function_type_alias.PatchSignatureFunction(signature_function);
 
-  const String& signature = String::Handle(signature_function.Signature());
+  const String& signature = String::Handle(isolate(),
+                                           signature_function.Signature());
   if (FLAG_trace_parser) {
     OS::Print("TopLevel parsing function type alias '%s'\n",
               signature.ToCString());
@@ -4338,7 +4383,7 @@
   // Lookup the signature class, i.e. the class whose name is the signature.
   // We only lookup in the current library, but not in its imports, and only
   // create a new canonical signature class if it does not exist yet.
-  Class& signature_class = Class::ZoneHandle(
+  Class& signature_class = Class::ZoneHandle(I,
       library_.LookupLocalClass(signature));
   if (signature_class.IsNull()) {
     signature_class = Class::NewSignatureClass(signature,
@@ -4443,12 +4488,12 @@
   TRACE_PARSER("ParseTypeParameters");
   if (CurrentToken() == Token::kLT) {
     const GrowableObjectArray& type_parameters_array =
-        GrowableObjectArray::Handle(GrowableObjectArray::New());
+        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
     intptr_t index = 0;
-    TypeParameter& type_parameter = TypeParameter::Handle();
-    TypeParameter& existing_type_parameter = TypeParameter::Handle();
-    String& existing_type_parameter_name = String::Handle();
-    AbstractType& type_parameter_bound = Type::Handle();
+    TypeParameter& type_parameter = TypeParameter::Handle(isolate());
+    TypeParameter& existing_type_parameter = TypeParameter::Handle(isolate());
+    String& existing_type_parameter_name = String::Handle(isolate());
+    AbstractType& type_parameter_bound = Type::Handle(isolate());
     do {
       ConsumeToken();
       const intptr_t metadata_pos = SkipMetadata();
@@ -4492,7 +4537,8 @@
       ErrorMsg("right angle bracket expected");
     }
     const TypeArguments& type_parameters =
-        TypeArguments::Handle(NewTypeArguments(type_parameters_array));
+        TypeArguments::Handle(isolate(),
+                              NewTypeArguments(type_parameters_array));
     cls.set_type_parameters(type_parameters);
     // Try to resolve the upper bounds, which will at least resolve the
     // referenced type parameters.
@@ -4514,8 +4560,8 @@
   TRACE_PARSER("ParseTypeArguments");
   if (CurrentToken() == Token::kLT) {
     const GrowableObjectArray& types =
-        GrowableObjectArray::Handle(GrowableObjectArray::New());
-    AbstractType& type = AbstractType::Handle();
+        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+    AbstractType& type = AbstractType::Handle(isolate());
     do {
       ConsumeToken();
       type = ParseType(finalization);
@@ -4544,10 +4590,10 @@
   TRACE_PARSER("ParseInterfaceList");
   ASSERT(CurrentToken() == Token::kIMPLEMENTS);
   const GrowableObjectArray& all_interfaces =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
-  AbstractType& interface = AbstractType::Handle();
+      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+  AbstractType& interface = AbstractType::Handle(isolate());
   // First get all the interfaces already implemented by class.
-  Array& cls_interfaces = Array::Handle(cls.interfaces());
+  Array& cls_interfaces = Array::Handle(isolate(), cls.interfaces());
   for (intptr_t i = 0; i < cls_interfaces.Length(); i++) {
     interface ^= cls_interfaces.At(i);
     all_interfaces.Add(interface);
@@ -4560,7 +4606,8 @@
     if (interface.IsTypeParameter()) {
       ErrorMsg(interface_pos,
                "type parameter '%s' may not be used in interface list",
-               String::Handle(interface.UserVisibleName()).ToCString());
+               String::Handle(isolate(),
+                              interface.UserVisibleName()).ToCString());
     }
     all_interfaces.Add(interface);
   } while (CurrentToken() == Token::kCOMMA);
@@ -4573,8 +4620,8 @@
   TRACE_PARSER("ParseMixins");
   ASSERT(CurrentToken() == Token::kWITH);
   const GrowableObjectArray& mixin_types =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
-  AbstractType& mixin_type = AbstractType::Handle();
+      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+  AbstractType& mixin_type = AbstractType::Handle(isolate());
   do {
     ConsumeToken();
     mixin_type = ParseType(ClassFinalizer::kResolveTypeParameters);
@@ -4586,12 +4633,13 @@
     if (mixin_type.IsTypeParameter()) {
       ErrorMsg(mixin_type.token_pos(),
                "mixin type '%s' may not be a type parameter",
-               String::Handle(mixin_type.UserVisibleName()).ToCString());
+               String::Handle(isolate(),
+                              mixin_type.UserVisibleName()).ToCString());
     }
     mixin_types.Add(mixin_type);
   } while (CurrentToken() == Token::kCOMMA);
   return MixinAppType::New(super_type,
-                           Array::Handle(Array::MakeArray(mixin_types)));
+      Array::Handle(isolate(), Array::MakeArray(mixin_types)));
 }
 
 
@@ -4602,10 +4650,10 @@
   // Const fields are implicitly final.
   const bool is_final = is_const || (CurrentToken() == Token::kFINAL);
   const bool is_static = true;
-  const AbstractType& type = AbstractType::ZoneHandle(ParseConstFinalVarOrType(
-      ClassFinalizer::kResolveTypeParameters));
-  Field& field = Field::Handle();
-  Function& getter = Function::Handle();
+  const AbstractType& type = AbstractType::ZoneHandle(I,
+      ParseConstFinalVarOrType(ClassFinalizer::kResolveTypeParameters));
+  Field& field = Field::Handle(isolate());
+  Function& getter = Function::Handle(isolate());
   while (true) {
     const intptr_t name_pos = TokenPos();
     String& var_name = *ExpectIdentifier("variable name expected");
@@ -4618,7 +4666,8 @@
     // or final field implies a setter which throws a NoSuchMethodError,
     // thus we need to check for conflicts with existing setters and
     // getters.
-    String& accessor_name = String::Handle(Field::GetterName(var_name));
+    String& accessor_name = String::Handle(isolate(),
+                                           Field::GetterName(var_name));
     if (library_.LookupLocalObject(accessor_name) != Object::null()) {
       ErrorMsg(name_pos, "getter for '%s' is already defined",
                var_name.ToCString());
@@ -4632,7 +4681,7 @@
     field = Field::New(var_name, is_static, is_final, is_const,
                        current_class(), name_pos);
     field.set_type(type);
-    field.set_value(Instance::Handle(Instance::null()));
+    field.set_value(Instance::Handle(isolate(), Instance::null()));
     top_level->fields.Add(field);
     library_.AddObject(field, var_name);
     if (metadata_pos >= 0) {
@@ -4640,7 +4689,8 @@
     }
     if (CurrentToken() == Token::kASSIGN) {
       ConsumeToken();
-      Instance& field_value = Instance::Handle(Object::sentinel().raw());
+      Instance& field_value = Instance::Handle(isolate(),
+                                               Object::sentinel().raw());
       bool has_simple_literal = false;
       if (LookaheadToken(1) == Token::kSEMICOLON) {
         has_simple_literal = IsSimpleLiteral(type, &field_value);
@@ -4649,7 +4699,8 @@
       field.set_value(field_value);
       if (!has_simple_literal) {
         // Create a static final getter.
-        String& getter_name = String::Handle(Field::GetterSymbol(var_name));
+        String& getter_name = String::Handle(isolate(),
+                                             Field::GetterSymbol(var_name));
         getter = Function::New(getter_name,
                                RawFunction::kImplicitStaticFinalGetter,
                                is_static,
@@ -4664,7 +4715,7 @@
 
         // Create initializer function.
         if (!field.is_const()) {
-          const Function& init_function = Function::ZoneHandle(
+          const Function& init_function = Function::ZoneHandle(I,
               Function::NewStaticInitializer(field));
           top_level->functions.Add(init_function);
         }
@@ -4689,7 +4740,7 @@
                                    intptr_t metadata_pos) {
   TRACE_PARSER("ParseTopLevelFunction");
   const intptr_t decl_begin_pos = TokenPos();
-  AbstractType& result_type = Type::Handle(Type::DynamicType());
+  AbstractType& result_type = Type::Handle(isolate(), Type::DynamicType());
   const bool is_static = true;
   bool is_external = false;
   bool is_patch = false;
@@ -4722,7 +4773,8 @@
   } else if (!found && is_patch) {
     ErrorMsg(name_pos, "missing '%s' cannot be patched", func_name.ToCString());
   }
-  String& accessor_name = String::Handle(Field::GetterName(func_name));
+  String& accessor_name = String::Handle(isolate(),
+                                         Field::GetterName(func_name));
   if (library_.LookupLocalObject(accessor_name) != Object::null()) {
     ErrorMsg(name_pos, "'%s' is already defined as getter",
              func_name.ToCString());
@@ -4758,7 +4810,7 @@
   } else {
     ErrorMsg("function block expected");
   }
-  Function& func = Function::Handle(
+  Function& func = Function::Handle(isolate(),
       Function::New(func_name,
                     RawFunction::kRegularFunction,
                     is_static,
@@ -4793,7 +4845,7 @@
   const bool is_static = true;
   bool is_external = false;
   bool is_patch = false;
-  AbstractType& result_type = AbstractType::Handle();
+  AbstractType& result_type = AbstractType::Handle(isolate());
   if (is_patch_source() &&
       (CurrentToken() == Token::kIDENT) &&
       CurrentLiteral()->Equals("patch")) {
@@ -4832,7 +4884,7 @@
     const bool allow_explicit_default_values = true;
     ParseFormalParameterList(allow_explicit_default_values, false, &params);
   }
-  String& accessor_name = String::ZoneHandle();
+  String& accessor_name = String::ZoneHandle(I);
   int expected_num_parameters = -1;
   if (is_getter) {
     expected_num_parameters = 0;
@@ -4894,7 +4946,7 @@
   } else {
     ErrorMsg("function block expected");
   }
-  Function& func = Function::Handle(
+  Function& func = Function::Handle(isolate(),
       Function::New(accessor_name,
                     is_getter ? RawFunction::kGetterFunction :
                                 RawFunction::kSetterFunction,
@@ -4948,7 +5000,7 @@
   if (Dart_IsError(result)) {
     // In case of an error we append an explanatory error message to the
     // error obtained from the library tag handler.
-    Error& prev_error = Error::Handle();
+    Error& prev_error = Error::Handle(isolate());
     prev_error ^= Api::UnwrapHandle(result);
     AppendErrorMsg(prev_error, token_pos, "library handler failed");
   }
@@ -5014,7 +5066,7 @@
     ConsumeToken();
     CheckToken(Token::kAS, "'as' expected");
   }
-  String& prefix = String::Handle();
+  String& prefix = String::Handle(isolate());
   intptr_t prefix_pos = 0;
   if (is_import && (CurrentToken() == Token::kAS)) {
     ConsumeToken();
@@ -5022,13 +5074,13 @@
     prefix = ExpectIdentifier("prefix identifier expected")->raw();
   }
 
-  Array& show_names = Array::Handle();
-  Array& hide_names = Array::Handle();
+  Array& show_names = Array::Handle(isolate());
+  Array& hide_names = Array::Handle(isolate());
   if (is_deferred_import || IsLiteral("show") || IsLiteral("hide")) {
     GrowableObjectArray& show_list =
-        GrowableObjectArray::Handle(GrowableObjectArray::New());
+        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
     GrowableObjectArray& hide_list =
-        GrowableObjectArray::Handle(GrowableObjectArray::New());
+        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
     // Libraries imported through deferred import automatically hide
     // the name 'loadLibrary'.
     if (is_deferred_import) {
@@ -5058,7 +5110,8 @@
   const String& canon_url = String::CheckedHandle(
       CallLibraryTagHandler(Dart_kCanonicalizeUrl, import_pos, url));
   // Lookup the library URL.
-  Library& library = Library::Handle(Library::LookupLibrary(canon_url));
+  Library& library = Library::Handle(isolate(),
+                                     Library::LookupLibrary(canon_url));
   if (library.IsNull()) {
     // Create an empty library to mark that we have initiated loading of this
     // library.
@@ -5069,8 +5122,8 @@
     CallLibraryTagHandler(Dart_kImportTag, import_pos, canon_url);
   }
 
-  Namespace& ns =
-      Namespace::Handle(Namespace::New(library, show_names, hide_names));
+  Namespace& ns = Namespace::Handle(isolate(),
+      Namespace::New(library, show_names, hide_names));
   if (metadata_pos >= 0) {
     ns.AddMetadata(metadata_pos, current_class());
   }
@@ -5078,7 +5131,7 @@
   if (is_import) {
     // Ensure that private dart:_ libraries are only imported into dart:
     // libraries.
-    const String& lib_url = String::Handle(library_.url());
+    const String& lib_url = String::Handle(isolate(), library_.url());
     if (canon_url.StartsWith(Symbols::DartSchemePrivate()) &&
         !lib_url.StartsWith(Symbols::DartScheme())) {
       ErrorMsg(import_pos, "private library is not accessible");
@@ -5087,7 +5140,7 @@
       ASSERT(!is_deferred_import);
       library_.AddImport(ns);
     } else {
-      LibraryPrefix& library_prefix = LibraryPrefix::Handle();
+      LibraryPrefix& library_prefix = LibraryPrefix::Handle(isolate());
       library_prefix = library_.LookupLocalLibraryPrefix(prefix);
       if (!library_prefix.IsNull()) {
         // Check that prefix names of deferred import clauses are
@@ -5165,9 +5218,9 @@
   // Core lib has not been explicitly imported, so we implicitly
   // import it here.
   if (!library_.ImportsCorelib()) {
-    Library& core_lib = Library::Handle(Library::CoreLibrary());
+    Library& core_lib = Library::Handle(isolate(), Library::CoreLibrary());
     ASSERT(!core_lib.IsNull());
-    const Namespace& core_ns = Namespace::Handle(
+    const Namespace& core_ns = Namespace::Handle(isolate(),
         Namespace::New(core_lib, Object::null_array(), Object::null_array()));
     library_.AddImport(core_ns);
   }
@@ -5210,7 +5263,7 @@
   SetPosition(0);
   is_top_level_ = true;
   TopLevel top_level;
-  Class& toplevel_class = Class::Handle(
+  Class& toplevel_class = Class::Handle(isolate(),
       Class::New(Symbols::TopLevel(), script_, TokenPos()));
   toplevel_class.set_library(library_);
 
@@ -5255,7 +5308,8 @@
   if ((top_level.fields.Length() > 0) || (top_level.functions.Length() > 0)) {
     toplevel_class.AddFields(top_level.fields);
 
-    const Array& array = Array::Handle(Array::MakeArray(top_level.functions));
+    const Array& array = Array::Handle(isolate(),
+                                       Array::MakeArray(top_level.functions));
     toplevel_class.SetFunctions(array);
 
     library_.AddAnonymousClass(toplevel_class);
@@ -5265,9 +5319,10 @@
 
 
 void Parser::ChainNewBlock(LocalScope* outer_scope) {
-  Block* block = new Block(current_block_,
-                           outer_scope,
-                           new SequenceNode(TokenPos(), outer_scope));
+  Block* block = new(isolate()) Block(
+      current_block_,
+      outer_scope,
+      new(isolate()) SequenceNode(TokenPos(), outer_scope));
   current_block_ = block;
 }
 
@@ -5275,18 +5330,18 @@
 void Parser::OpenBlock() {
   ASSERT(current_block_ != NULL);
   LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new LocalScope(outer_scope,
-                               outer_scope->function_level(),
-                               outer_scope->loop_level()));
+  ChainNewBlock(new(isolate()) LocalScope(
+      outer_scope, outer_scope->function_level(), outer_scope->loop_level()));
 }
 
 
 void Parser::OpenLoopBlock() {
   ASSERT(current_block_ != NULL);
   LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new LocalScope(outer_scope,
-                               outer_scope->function_level(),
-                               outer_scope->loop_level() + 1));
+  ChainNewBlock(new(isolate()) LocalScope(
+      outer_scope,
+      outer_scope->function_level(),
+      outer_scope->loop_level() + 1));
 }
 
 
@@ -5390,7 +5445,7 @@
     ParamDesc& param_desc = (*params->parameters)[i];
     ASSERT(!is_top_level_ || param_desc.type->IsResolved());
     const String* name = param_desc.name;
-    LocalVariable* parameter = new LocalVariable(
+    LocalVariable* parameter = new(isolate()) LocalVariable(
         param_desc.name_pos, *name, *param_desc.type);
     if (!scope->InsertParameterAt(i, parameter)) {
       ErrorMsg(param_desc.name_pos,
@@ -5413,8 +5468,8 @@
                                       const Function& func) {
   ASSERT(func.is_native());
   TRACE_PARSER("ParseNativeFunctionBlock");
-  const Class& cls = Class::Handle(func.Owner());
-  const Library& library = Library::Handle(cls.library());
+  const Class& cls = Class::Handle(isolate(), func.Owner());
+  const Library& library = Library::Handle(isolate(), cls.library());
   ASSERT(func.NumParameters() == params->parameters->length());
 
   // Parse the function name out.
@@ -5436,14 +5491,14 @@
   // Now add the NativeBodyNode and return statement.
   Dart_NativeEntryResolver resolver = library.native_entry_resolver();
   bool is_bootstrap_native = Bootstrap::IsBootstapResolver(resolver);
-  current_block_->statements->Add(
-      new ReturnNode(TokenPos(),
-                     new NativeBodyNode(TokenPos(),
-                                        Function::ZoneHandle(func.raw()),
-                                        native_name,
-                                        native_function,
-                                        current_block_->scope,
-                                        is_bootstrap_native)));
+  current_block_->statements->Add(new(isolate()) ReturnNode(
+      TokenPos(), new(isolate()) NativeBodyNode(
+          TokenPos(),
+          Function::ZoneHandle(I, func.raw()),
+          native_name,
+          native_function,
+          current_block_->scope,
+          is_bootstrap_native)));
 }
 
 
@@ -5489,7 +5544,7 @@
   if (receiver == NULL) {
     ErrorMsg(token_pos, "illegal implicit access to receiver 'this'");
   }
-  return new LoadLocalNode(TokenPos(), receiver);
+  return new(isolate()) LoadLocalNode(TokenPos(), receiver);
 }
 
 
@@ -5501,14 +5556,14 @@
   LocalVariable* param = LookupTypeArgumentsParameter(current_block_->scope,
                                                       kTestOnly);
   ASSERT(param != NULL);
-  return new LoadLocalNode(TokenPos(), param);
+  return new(isolate()) LoadLocalNode(TokenPos(), param);
 }
 
 
 AstNode* Parser::CallGetter(intptr_t token_pos,
                             AstNode* object,
                             const String& name) {
-  return new InstanceGetterNode(token_pos, object, name);
+  return new(isolate()) InstanceGetterNode(token_pos, object, name);
 }
 
 
@@ -5520,7 +5575,8 @@
   ASSERT(IsIdentifier());
   const intptr_t ident_pos = TokenPos();
   const String& ident = *CurrentLiteral();
-  LocalVariable* variable = new LocalVariable(ident_pos, ident, type);
+  LocalVariable* variable = new(isolate()) LocalVariable(
+      ident_pos, ident, type);
   ConsumeToken();  // Variable identifier.
   AstNode* initialization = NULL;
   if (CurrentToken() == Token::kASSIGN) {
@@ -5528,7 +5584,8 @@
     const intptr_t assign_pos = TokenPos();
     ConsumeToken();
     AstNode* expr = ParseExpr(is_const, kConsumeCascades);
-    initialization = new StoreLocalNode(assign_pos, variable, expr);
+    initialization = new(isolate()) StoreLocalNode(
+        assign_pos, variable, expr);
     if (is_const) {
       ASSERT(expr->IsLiteralNode());
       variable->SetConstValue(expr->AsLiteralNode()->literal());
@@ -5538,8 +5595,10 @@
     "missing initialization of 'final' or 'const' variable");
   } else {
     // Initialize variable with null.
-    AstNode* null_expr = new LiteralNode(ident_pos, Instance::ZoneHandle());
-    initialization = new StoreLocalNode(ident_pos, variable, null_expr);
+    AstNode* null_expr = new(isolate()) LiteralNode(
+        ident_pos, Instance::ZoneHandle(I));
+    initialization = new(isolate()) StoreLocalNode(
+        ident_pos, variable, null_expr);
   }
 
   ASSERT(current_block_ != NULL);
@@ -5630,9 +5689,9 @@
   SkipMetadata();
   bool is_final = (CurrentToken() == Token::kFINAL);
   bool is_const = (CurrentToken() == Token::kCONST);
-  const AbstractType& type = AbstractType::ZoneHandle(ParseConstFinalVarOrType(
-      FLAG_enable_type_checks ? ClassFinalizer::kCanonicalize :
-                                ClassFinalizer::kIgnore));
+  const AbstractType& type = AbstractType::ZoneHandle(I,
+      ParseConstFinalVarOrType(FLAG_enable_type_checks ?
+          ClassFinalizer::kCanonicalize : ClassFinalizer::kIgnore));
   if (!IsIdentifier()) {
     ErrorMsg("identifier expected");
   }
@@ -5658,7 +5717,7 @@
 
 AstNode* Parser::ParseFunctionStatement(bool is_literal) {
   TRACE_PARSER("ParseFunctionStatement");
-  AbstractType& result_type = AbstractType::Handle();
+  AbstractType& result_type = AbstractType::Handle(isolate());
   const String* variable_name = NULL;
   const String* function_name = NULL;
 
@@ -5702,7 +5761,7 @@
   // and register it in the current class.
   // Note that we cannot share the same closure function between the closurized
   // and non-closurized versions of the same parent function.
-  Function& function = Function::ZoneHandle();
+  Function& function = Function::ZoneHandle(I);
   bool is_new_closure = false;
   // TODO(hausner): There could be two different closures at the given
   // function_pos, one enclosed in a closurized function and one enclosed in the
@@ -5725,22 +5784,22 @@
   // passed as a function argument, or returned as a function result.
 
   LocalVariable* function_variable = NULL;
-  Type& function_type = Type::ZoneHandle();
+  Type& function_type = Type::ZoneHandle(I);
   if (variable_name != NULL) {
     // Since the function type depends on the signature of the closure function,
     // it cannot be determined before the formal parameter list of the closure
     // function is parsed. Therefore, we set the function type to a new
     // parameterized type to be patched after the actual type is known.
     // We temporarily use the class of the Function interface.
-    const Class& unknown_signature_class = Class::Handle(
-        Type::Handle(Type::Function()).type_class());
-    function_type = Type::New(
-        unknown_signature_class, TypeArguments::Handle(), function_pos);
+    const Class& unknown_signature_class = Class::Handle(isolate(),
+        Type::Handle(isolate(), Type::Function()).type_class());
+    function_type = Type::New(unknown_signature_class,
+                              TypeArguments::Handle(isolate()), function_pos);
     function_type.SetIsFinalized();  // No finalization needed.
 
     // Add the function variable to the scope before parsing the function in
     // order to allow self reference from inside the function.
-    function_variable = new LocalVariable(function_pos,
+    function_variable = new(isolate()) LocalVariable(function_pos,
                                           *variable_name,
                                           function_type);
     function_variable->set_is_final();
@@ -5763,15 +5822,15 @@
   }
 
   // Parse the local function.
-  Array& default_parameter_values = Array::Handle();
+  Array& default_parameter_values = Array::Handle(isolate());
   SequenceNode* statements = Parser::ParseFunc(function,
                                                &default_parameter_values);
 
   // Now that the local function has formal parameters, lookup the signature
   // class in the current library (but not in its imports) and only create a new
   // canonical signature class if it does not exist yet.
-  const String& signature = String::Handle(function.Signature());
-  Class& signature_class = Class::ZoneHandle();
+  const String& signature = String::Handle(isolate(), function.Signature());
+  Class& signature_class = Class::ZoneHandle(I);
   if (!is_new_closure) {
     signature_class = function.signature_class();
   }
@@ -5806,9 +5865,10 @@
 
   // Since the signature type is cached by the signature class, it may have
   // been finalized already.
-  Type& signature_type = Type::Handle(signature_class.SignatureType());
-  TypeArguments& signature_type_arguments =
-      TypeArguments::Handle(signature_type.arguments());
+  Type& signature_type = Type::Handle(isolate(),
+                                      signature_class.SignatureType());
+  TypeArguments& signature_type_arguments = TypeArguments::Handle(isolate(),
+      signature_type.arguments());
 
   if (!signature_type.IsFinalized()) {
     signature_type ^= ClassFinalizer::FinalizeType(
@@ -5863,15 +5923,15 @@
   // variables are not relevant for the compilation of the enclosing function.
   // This pruning is done by omitting to hook the local scope in its parent
   // scope in the constructor of LocalScope.
-  AstNode* closure =
-      new ClosureNode(function_pos, function, NULL, statements->scope());
+  AstNode* closure = new(isolate()) ClosureNode(
+      function_pos, function, NULL, statements->scope());
 
   if (function_variable == NULL) {
     ASSERT(is_literal);
     return closure;
   } else {
-    AstNode* initialization =
-        new StoreLocalNode(function_pos, function_variable, closure);
+    AstNode* initialization = new(isolate()) StoreLocalNode(
+        function_pos, function_variable, closure);
     return initialization;
   }
 }
@@ -6256,7 +6316,8 @@
     ConsumeToken();
     false_branch = ParseNestedStatement(parsing_loop_body, NULL);
   }
-  AstNode* if_node = new IfNode(if_pos, cond_expr, true_branch, false_branch);
+  AstNode* if_node = new(isolate()) IfNode(
+      if_pos, cond_expr, true_branch, false_branch);
   if (label != NULL) {
     current_block_->statements->Add(if_node);
     SequenceNode* sequence = CloseBlock();
@@ -6323,9 +6384,9 @@
     }
   }
   if (first_value.IsInteger()) {
-    return Type::Handle(Type::IntType()).type_class();
+    return Type::Handle(isolate(), Type::IntType()).type_class();
   } else if (first_value.IsString()) {
-    return Type::Handle(Type::StringType()).type_class();
+    return Type::Handle(isolate(), Type::StringType()).type_class();
   }
   return first_value.clazz();
 }
@@ -6338,7 +6399,7 @@
   bool default_seen = false;
   const intptr_t case_pos = TokenPos();
   // The case expressions node sequence does not own the enclosing scope.
-  SequenceNode* case_expressions = new SequenceNode(case_pos, NULL);
+  SequenceNode* case_expressions = new(isolate()) SequenceNode(case_pos, NULL);
   while (CurrentToken() == Token::kCASE || CurrentToken() == Token::kDEFAULT) {
     if (CurrentToken() == Token::kCASE) {
       if (default_seen) {
@@ -6350,12 +6411,10 @@
       ASSERT(expr->IsLiteralNode());
       case_expr_values->Add(expr->AsLiteralNode());
 
-      AstNode* switch_expr_load = new LoadLocalNode(case_pos,
-                                                    switch_expr_value);
-      AstNode* case_comparison = new ComparisonNode(expr_pos,
-                                                    Token::kEQ,
-                                                    expr,
-                                                    switch_expr_load);
+      AstNode* switch_expr_load = new(isolate()) LoadLocalNode(
+          case_pos, switch_expr_value);
+      AstNode* case_comparison = new(isolate()) ComparisonNode(
+          expr_pos, Token::kEQ, expr, switch_expr_load);
       case_expressions->Add(case_comparison);
     } else {
       if (default_seen) {
@@ -6388,9 +6447,10 @@
       // End of this case clause. If there is a possible fall-through to
       // the next case clause, throw an implicit FallThroughError.
       if (!abrupt_completing_seen) {
-        ArgumentListNode* arguments = new ArgumentListNode(TokenPos());
-        arguments->Add(new LiteralNode(
-            TokenPos(), Integer::ZoneHandle(Integer::New(TokenPos()))));
+        ArgumentListNode* arguments = new(isolate()) ArgumentListNode(
+            TokenPos());
+        arguments->Add(new(isolate()) LiteralNode(
+            TokenPos(), Integer::ZoneHandle(I, Integer::New(TokenPos()))));
         current_block_->statements->Add(
             MakeStaticCall(Symbols::FallThroughError(),
                            Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -6406,7 +6466,7 @@
     }
   }
   SequenceNode* statements = CloseBlock();
-  return new CaseNode(case_pos, case_label,
+  return new(isolate()) CaseNode(case_pos, case_label,
       case_expressions, default_seen, switch_expr_value, statements);
 }
 
@@ -6431,16 +6491,16 @@
   // type of the case clause expressions. Therefore, we have to allocate
   // a new type representing dynamic and can't reuse the canonical
   // type object for dynamic.
-  const Type& temp_var_type =
-      Type::ZoneHandle(Type::New(Class::Handle(Object::dynamic_class()),
-                                 TypeArguments::Handle(),
-                                 expr_pos));
+  const Type& temp_var_type = Type::ZoneHandle(I,
+       Type::New(Class::Handle(isolate(), Object::dynamic_class()),
+                 TypeArguments::Handle(isolate()),
+                 expr_pos));
   temp_var_type.SetIsFinalized();
-  LocalVariable* temp_variable =
-      new LocalVariable(expr_pos,  Symbols::SwitchExpr(), temp_var_type);
+  LocalVariable* temp_variable = new(isolate()) LocalVariable(
+      expr_pos,  Symbols::SwitchExpr(), temp_var_type);
   current_block_->scope->AddVariable(temp_variable);
-  AstNode* save_switch_expr =
-      new StoreLocalNode(expr_pos, temp_variable, switch_expr);
+  AstNode* save_switch_expr = new(isolate()) StoreLocalNode(
+      expr_pos, temp_variable, switch_expr);
   current_block_->statements->Add(save_switch_expr);
 
   // Parse case clauses
@@ -6458,8 +6518,8 @@
       case_label = current_block_->scope->LocalLookupLabel(*label_name);
       if (case_label == NULL) {
         // Label does not exist yet. Add it to scope of switch statement.
-        case_label =
-            new SourceLabel(label_pos, *label_name, SourceLabel::kCase);
+        case_label = new(isolate()) SourceLabel(
+            label_pos, *label_name, SourceLabel::kCase);
         current_block_->scope->AddLabel(case_label);
       } else if (case_label->kind() == SourceLabel::kForward) {
         // We have seen a 'continue' with this label name. Resolve
@@ -6494,7 +6554,7 @@
   // variable holding the switch expression to match the type of the
   // case clause constants.
   temp_var_type.set_type_class(
-      Class::Handle(CheckCaseExpressions(case_expr_values)));
+      Class::Handle(isolate(), CheckCaseExpressions(case_expr_values)));
 
   // Check for unresolved label references.
   SourceLabel* unresolved_label =
@@ -6506,7 +6566,7 @@
 
   SequenceNode* switch_body = CloseBlock();
   ExpectToken(Token::kRBRACE);
-  return new SwitchNode(switch_pos, label, switch_body);
+  return new(isolate()) SwitchNode(switch_pos, label, switch_body);
 }
 
 
@@ -6521,7 +6581,7 @@
   ExpectToken(Token::kRPAREN);
   const bool parsing_loop_body =  true;
   SequenceNode* while_body = ParseNestedStatement(parsing_loop_body, label);
-  return new WhileNode(while_pos, label, cond_expr, while_body);
+  return new(isolate()) WhileNode(while_pos, label, cond_expr, while_body);
 }
 
 
@@ -6538,7 +6598,7 @@
   AstNode* cond_expr = ParseExpr(kAllowConst, kConsumeCascades);
   ExpectToken(Token::kRPAREN);
   ExpectSemicolon();
-  return new DoWhileNode(do_pos, label, cond_expr, dowhile_body);
+  return new(isolate()) DoWhileNode(do_pos, label, cond_expr, dowhile_body);
 }
 
 
@@ -6558,12 +6618,12 @@
   } else {
     // The case without a type is handled above, so require a type here.
     const AbstractType& type =
-        AbstractType::ZoneHandle(ParseConstFinalVarOrType(
+        AbstractType::ZoneHandle(I, ParseConstFinalVarOrType(
             FLAG_enable_type_checks ? ClassFinalizer::kCanonicalize :
                                       ClassFinalizer::kIgnore));
     loop_var_pos = TokenPos();
     loop_var_name = ExpectIdentifier("variable name expected");
-    loop_var = new LocalVariable(loop_var_pos, *loop_var_name, type);
+    loop_var = new(isolate()) LocalVariable(loop_var_pos, *loop_var_name, type);
     if (is_final) {
       loop_var->set_is_final();
     }
@@ -6581,23 +6641,23 @@
   // would refer to the compiler generated iterator and could confuse the user.
   // It is better to leave the iterator untyped and postpone the type error
   // until the loop variable is assigned to.
-  const AbstractType& iterator_type = Type::ZoneHandle(Type::DynamicType());
-  LocalVariable* iterator_var =
-      new LocalVariable(collection_pos, Symbols::ForInIter(), iterator_type);
+  const AbstractType& iterator_type = Type::ZoneHandle(I, Type::DynamicType());
+  LocalVariable* iterator_var = new(isolate()) LocalVariable(
+      collection_pos, Symbols::ForInIter(), iterator_type);
   current_block_->scope->AddVariable(iterator_var);
 
   // Generate initialization of iterator variable.
-  ArgumentListNode* no_args = new ArgumentListNode(collection_pos);
-  AstNode* get_iterator = new InstanceGetterNode(
+  ArgumentListNode* no_args = new(isolate()) ArgumentListNode(collection_pos);
+  AstNode* get_iterator = new(isolate()) InstanceGetterNode(
       collection_pos, collection_expr, Symbols::GetIterator());
   AstNode* iterator_init =
-      new StoreLocalNode(collection_pos, iterator_var, get_iterator);
+      new(isolate()) StoreLocalNode(collection_pos, iterator_var, get_iterator);
   current_block_->statements->Add(iterator_init);
 
   // Generate while loop condition.
-  AstNode* iterator_moveNext = new InstanceCallNode(
+  AstNode* iterator_moveNext = new(isolate()) InstanceCallNode(
       collection_pos,
-      new LoadLocalNode(collection_pos, iterator_var),
+      new(isolate()) LoadLocalNode(collection_pos, iterator_var),
       Symbols::MoveNext(),
       no_args);
 
@@ -6608,9 +6668,9 @@
   OpenLoopBlock();
   current_block_->scope->AddLabel(label);
 
-  AstNode* iterator_current = new InstanceGetterNode(
+  AstNode* iterator_current = new(isolate()) InstanceGetterNode(
       collection_pos,
-      new LoadLocalNode(collection_pos, iterator_var),
+      new(isolate()) LoadLocalNode(collection_pos, iterator_var),
       Symbols::Current());
 
   // Generate assignment of next iterator value to loop variable.
@@ -6619,7 +6679,7 @@
     // The for loop declares a new variable. Add it to the loop body scope.
     current_block_->scope->AddVariable(loop_var);
     loop_var_assignment =
-        new StoreLocalNode(loop_var_pos, loop_var, iterator_current);
+        new(isolate()) StoreLocalNode(loop_var_pos, loop_var, iterator_current);
   } else {
     AstNode* loop_var_primary =
         ResolveIdent(loop_var_pos, *loop_var_name, false);
@@ -6644,8 +6704,8 @@
 
   SequenceNode* for_loop_statement = CloseBlock();
 
-  AstNode* while_statement =
-      new WhileNode(forin_pos, label, iterator_moveNext, for_loop_statement);
+  AstNode* while_statement = new(isolate()) WhileNode(
+      forin_pos, label, iterator_moveNext, for_loop_statement);
   current_block_->statements->Add(while_statement);
 
   return CloseBlock();  // Implicit block around while loop.
@@ -6696,8 +6756,8 @@
   for (int i = 0; i < init_scope->num_variables(); i++) {
     if (init_scope->VariableAt(i)->is_captured() &&
         (init_scope->VariableAt(i)->owner() == init_scope)) {
-      SequenceNode* incr_sequence = new SequenceNode(incr_pos, NULL);
-      incr_sequence->Add(new CloneContextNode(for_pos));
+      SequenceNode* incr_sequence = new(isolate()) SequenceNode(incr_pos, NULL);
+      incr_sequence->Add(new(isolate()) CloneContextNode(for_pos));
       if (increment != NULL) {
         incr_sequence->Add(increment);
       }
@@ -6706,7 +6766,7 @@
     }
   }
   AstNode* for_node =
-      new ForNode(for_pos,
+      new(isolate()) ForNode(for_pos,
                   label,
                   NodeAsSequenceNode(init_pos, initializer, NULL),
                   condition,
@@ -6721,24 +6781,25 @@
 AstNode* Parser::MakeStaticCall(const String& cls_name,
                                 const String& func_name,
                                 ArgumentListNode* arguments) {
-  const Class& cls = Class::Handle(Library::LookupCoreClass(cls_name));
+  const Class& cls = Class::Handle(isolate(),
+                                   Library::LookupCoreClass(cls_name));
   ASSERT(!cls.IsNull());
-  const Function& func = Function::ZoneHandle(
+  const Function& func = Function::ZoneHandle(I,
       Resolver::ResolveStatic(cls,
                               func_name,
                               arguments->length(),
                               arguments->names()));
   ASSERT(!func.IsNull());
-  return new StaticCallNode(arguments->token_pos(), func, arguments);
+  return new(isolate()) StaticCallNode(arguments->token_pos(), func, arguments);
 }
 
 
 AstNode* Parser::MakeAssertCall(intptr_t begin, intptr_t end) {
-  ArgumentListNode* arguments = new ArgumentListNode(begin);
-  arguments->Add(new LiteralNode(begin,
-      Integer::ZoneHandle(Integer::New(begin))));
-  arguments->Add(new LiteralNode(end,
-      Integer::ZoneHandle(Integer::New(end))));
+  ArgumentListNode* arguments = new(isolate()) ArgumentListNode(begin);
+  arguments->Add(new(isolate()) LiteralNode(begin,
+      Integer::ZoneHandle(I, Integer::New(begin))));
+  arguments->Add(new(isolate()) LiteralNode(end,
+      Integer::ZoneHandle(I, Integer::New(end))));
   return MakeStaticCall(Symbols::AssertionError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
                         arguments);
@@ -6751,7 +6812,9 @@
        condition->AsStoreLocalNode()->value()->IsClosureNode())) {
     // Function literal in assert implies a call.
     const intptr_t pos = condition->token_pos();
-    condition = BuildClosureCall(pos, condition, new ArgumentListNode(pos));
+    condition = BuildClosureCall(pos,
+                                 condition,
+                                 new(isolate()) ArgumentListNode(pos));
   } else if (condition->IsConditionalExprNode()) {
     ConditionalExprNode* cond_expr = condition->AsConditionalExprNode();
     cond_expr->set_true_expr(InsertClosureCallNodes(cond_expr->true_expr()));
@@ -6775,12 +6838,13 @@
   const intptr_t condition_end = TokenPos();
   ExpectToken(Token::kRPAREN);
   condition = InsertClosureCallNodes(condition);
-  condition = new UnaryOpNode(condition_pos, Token::kNOT, condition);
+  condition = new(isolate()) UnaryOpNode(condition_pos, Token::kNOT, condition);
   AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end);
-  return new IfNode(condition_pos,
-                    condition,
-                    NodeAsSequenceNode(condition_pos, assert_throw, NULL),
-                    NULL);
+  return new(isolate()) IfNode(
+      condition_pos,
+      condition,
+      NodeAsSequenceNode(condition_pos, assert_throw, NULL),
+      NULL);
 }
 
 
@@ -6799,18 +6863,20 @@
                                    CatchParamDesc* stack_trace_param,
                                    LocalScope* scope) {
   if (exception_param->name != NULL) {
-    LocalVariable* var = new LocalVariable(exception_param->token_pos,
-                                           *exception_param->name,
-                                           *exception_param->type);
+    LocalVariable* var = new(isolate()) LocalVariable(
+        exception_param->token_pos,
+        *exception_param->name,
+        *exception_param->type);
     var->set_is_final();
     bool added_to_scope = scope->AddVariable(var);
     ASSERT(added_to_scope);
     exception_param->var = var;
   }
   if (stack_trace_param->name != NULL) {
-    LocalVariable* var = new LocalVariable(stack_trace_param->token_pos,
-                                           *stack_trace_param->name,
-                                           *stack_trace_param->type);
+    LocalVariable* var = new(isolate()) LocalVariable(
+        stack_trace_param->token_pos,
+        *stack_trace_param->name,
+        *stack_trace_param->type);
     var->set_is_final();
     bool added_to_scope = scope->AddVariable(var);
     if (!added_to_scope) {
@@ -6836,7 +6902,8 @@
 
 void Parser::PushTryBlock(Block* try_block) {
   intptr_t try_index = AllocateTryIndex();
-  TryBlocks* block = new TryBlocks(try_block, try_blocks_list_, try_index);
+  TryBlocks* block = new(isolate()) TryBlocks(
+      try_block, try_blocks_list_, try_index);
   try_blocks_list_ = block;
 }
 
@@ -6917,10 +6984,10 @@
     CatchParamDesc stack_trace_param;
     if (IsLiteral("on")) {
       ConsumeToken();
-      exception_param.type = &AbstractType::ZoneHandle(
+      exception_param.type = &AbstractType::ZoneHandle(I,
           ParseType(ClassFinalizer::kCanonicalize));
     } else {
-      exception_param.type = &AbstractType::ZoneHandle(Type::DynamicType());
+      exception_param.type = &AbstractType::ZoneHandle(I, Type::DynamicType());
     }
     if (CurrentToken() == Token::kCATCH) {
       ConsumeToken();  // Consume the 'catch'.
@@ -6931,7 +6998,7 @@
         ConsumeToken();
         // TODO(hausner): Make implicit type be StackTrace, not dynamic.
         stack_trace_param.type =
-            &AbstractType::ZoneHandle(Type::DynamicType());
+            &AbstractType::ZoneHandle(I, Type::DynamicType());
         stack_trace_param.token_pos = TokenPos();
         stack_trace_param.name = ExpectIdentifier("identifier expected");
       }
@@ -6951,26 +7018,25 @@
       // Generate code to load the exception object (:exception_var) into
       // the exception variable specified in this block.
       ASSERT(exception_var != NULL);
-      current_block_->statements->Add(
-          new StoreLocalNode(catch_pos, exception_param.var,
-                             new LoadLocalNode(catch_pos, exception_var)));
+      current_block_->statements->Add(new(isolate()) StoreLocalNode(
+          catch_pos, exception_param.var, new(isolate()) LoadLocalNode(
+              catch_pos, exception_var)));
     }
     if (stack_trace_param.var != NULL) {
       // A stack trace variable is specified in this block, so generate code
       // to load the stack trace object (:stack_trace_var) into the stack
       // trace variable specified in this block.
       *needs_stack_trace = true;
-      ArgumentListNode* no_args = new ArgumentListNode(catch_pos);
+      ArgumentListNode* no_args = new(isolate()) ArgumentListNode(catch_pos);
       ASSERT(stack_trace_var != NULL);
-      current_block_->statements->Add(
-          new StoreLocalNode(catch_pos, stack_trace_param.var,
-                             new LoadLocalNode(catch_pos, stack_trace_var)));
-      current_block_->statements->Add(
-          new InstanceCallNode(
-              catch_pos,
-              new LoadLocalNode(catch_pos, stack_trace_param.var),
-              Library::PrivateCoreLibName(Symbols::_setupFullStackTrace()),
-              no_args));
+      current_block_->statements->Add(new(isolate()) StoreLocalNode(
+          catch_pos, stack_trace_param.var, new(isolate()) LoadLocalNode(
+              catch_pos, stack_trace_var)));
+      current_block_->statements->Add(new(isolate()) InstanceCallNode(
+          catch_pos,
+          new(isolate()) LoadLocalNode(catch_pos, stack_trace_param.var),
+          Library::PrivateCoreLibName(Symbols::_setupFullStackTrace()),
+          no_args));
     }
 
     // Add nested block with user-defined code.  This blocks allows
@@ -6987,10 +7053,10 @@
       // In the first case, unconditionally execute the catch body.  In the
       // second case, unconditionally throw.
       generic_catch_seen = true;
-      type_tests.Add(new LiteralNode(catch_pos, Bool::True()));
+      type_tests.Add(new(isolate()) LiteralNode(catch_pos, Bool::True()));
       if (is_bad_type) {
         // Replace the body with one that throws.
-        SequenceNode* block = new SequenceNode(catch_pos, NULL);
+        SequenceNode* block = new(isolate()) SequenceNode(catch_pos, NULL);
         block->Add(ThrowTypeError(catch_pos, *exception_param.type));
         catch_blocks.Last() = block;
       }
@@ -7006,13 +7072,15 @@
         // Make sure that the instantiator is captured.
         CaptureInstantiator();
       }
-      TypeNode* exception_type = new TypeNode(catch_pos, *exception_param.type);
-      AstNode* exception_value = new LoadLocalNode(catch_pos, exception_var);
+      TypeNode* exception_type = new(isolate()) TypeNode(
+          catch_pos, *exception_param.type);
+      AstNode* exception_value = new(isolate()) LoadLocalNode(
+          catch_pos, exception_var);
       if (!exception_type->type().IsInstantiated()) {
         EnsureExpressionTemp();
       }
-      type_tests.Add(new ComparisonNode(catch_pos, Token::kIS, exception_value,
-                                        exception_type));
+      type_tests.Add(new(isolate()) ComparisonNode(
+          catch_pos, Token::kIS, exception_value, exception_type));
 
       // Do not add uninstantiated types (e.g. type parameter T or generic
       // type List<T>), since the debugger won't be able to instantiate it
@@ -7039,11 +7107,11 @@
     // There isn't a generic catch clause so create a clause body that
     // rethrows the exception.  This includes the case that there were no
     // catch clauses.
-    current = new SequenceNode(handler_pos, NULL);
-    current->Add(
-        new ThrowNode(handler_pos,
-                      new LoadLocalNode(handler_pos, exception_var),
-                      new LoadLocalNode(handler_pos, stack_trace_var)));
+    current = new(isolate()) SequenceNode(handler_pos, NULL);
+    current->Add(new(isolate()) ThrowNode(
+        handler_pos,
+        new(isolate()) LoadLocalNode(handler_pos, exception_var),
+        new(isolate()) LoadLocalNode(handler_pos, stack_trace_var)));
   } else if (type_tests.Last()->IsLiteralNode()) {
     ASSERT(type_tests.Last()->AsLiteralNode()->literal().raw() ==
            Bool::True().raw());
@@ -7061,8 +7129,8 @@
   while (!type_tests.is_empty()) {
     AstNode* type_test = type_tests.RemoveLast();
     SequenceNode* catch_block = catch_blocks.RemoveLast();
-    current_block_->statements->Add(
-        new IfNode(type_test->token_pos(), type_test, catch_block, current));
+    current_block_->statements->Add(new(isolate()) IfNode(
+        type_test->token_pos(), type_test, catch_block, current));
     current = CloseBlock();
   }
   return current;
@@ -7088,25 +7156,28 @@
   LocalVariable* context_var =
       current_block_->scope->LocalLookupVariable(Symbols::SavedTryContextVar());
   if (context_var == NULL) {
-    context_var = new LocalVariable(TokenPos(),
-                                    Symbols::SavedTryContextVar(),
-                                    Type::ZoneHandle(Type::DynamicType()));
+    context_var = new(isolate()) LocalVariable(
+        TokenPos(),
+        Symbols::SavedTryContextVar(),
+        Type::ZoneHandle(I, Type::DynamicType()));
     current_block_->scope->AddVariable(context_var);
   }
   LocalVariable* exception_var =
       current_block_->scope->LocalLookupVariable(Symbols::ExceptionVar());
   if (exception_var == NULL) {
-    exception_var = new LocalVariable(TokenPos(),
-                                      Symbols::ExceptionVar(),
-                                      Type::ZoneHandle(Type::DynamicType()));
+    exception_var = new(isolate()) LocalVariable(
+        TokenPos(),
+        Symbols::ExceptionVar(),
+        Type::ZoneHandle(I, Type::DynamicType()));
     current_block_->scope->AddVariable(exception_var);
   }
   LocalVariable* stack_trace_var =
       current_block_->scope->LocalLookupVariable(Symbols::StackTraceVar());
   if (stack_trace_var == NULL) {
-    stack_trace_var = new LocalVariable(TokenPos(),
-                                        Symbols::StackTraceVar(),
-                                        Type::ZoneHandle(Type::DynamicType()));
+    stack_trace_var = new(isolate()) LocalVariable(
+        TokenPos(),
+        Symbols::StackTraceVar(),
+        Type::ZoneHandle(I, Type::DynamicType()));
     current_block_->scope->AddVariable(stack_trace_var);
   }
 
@@ -7137,7 +7208,7 @@
   try_blocks_list_->enter_catch();
   const intptr_t handler_pos = TokenPos();
   const GrowableObjectArray& handler_types =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
+      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
   bool needs_stack_trace = false;
   SequenceNode* catch_handler_list =
       ParseCatchClauses(handler_pos, exception_var, stack_trace_var,
@@ -7161,7 +7232,7 @@
         inner_try_block->GetNodeToInlineFinally(node_index);
     while (node_to_inline != NULL) {
       finally_block = ParseFinallyBlock();
-      InlinedFinallyNode* node = new InlinedFinallyNode(finally_pos,
+      InlinedFinallyNode* node = new(isolate()) InlinedFinallyNode(finally_pos,
                                                         finally_block,
                                                         context_var,
                                                         outer_try_index);
@@ -7173,24 +7244,22 @@
     finally_block = ParseFinallyBlock();
   }
 
-  CatchClauseNode* catch_clause =
-      new CatchClauseNode(handler_pos,
-                          catch_handler_list,
-                          Array::ZoneHandle(Array::MakeArray(handler_types)),
-                          context_var,
-                          exception_var,
-                          stack_trace_var,
-                          (finally_block != NULL)
-                              ? AllocateTryIndex()
-                              : CatchClauseNode::kInvalidTryIndex,
-                          needs_stack_trace);
+  CatchClauseNode* catch_clause = new(isolate()) CatchClauseNode(
+      handler_pos,
+      catch_handler_list,
+      Array::ZoneHandle(I, Array::MakeArray(handler_types)),
+      context_var,
+      exception_var,
+      stack_trace_var,
+      (finally_block != NULL) ?
+          AllocateTryIndex() : CatchClauseNode::kInvalidTryIndex,
+      needs_stack_trace);
 
   // Now create the try/catch ast node and return it. If there is a label
   // on the try/catch, close the block that's embedding the try statement
   // and attach the label to it.
-  AstNode* try_catch_node =
-      new TryCatchNode(try_pos, try_block, context_var, catch_clause,
-                       finally_block, try_index);
+  AstNode* try_catch_node = new(isolate()) TryCatchNode(
+      try_pos, try_block, context_var, catch_clause, finally_block, try_index);
 
   if (try_label != NULL) {
     current_block_->statements->Add(try_catch_node);
@@ -7231,7 +7300,7 @@
       LocalScope* switch_scope = current_block_->scope->LookupSwitchScope();
       if (switch_scope != NULL) {
         // We found a switch scope. Enter a forward reference to the label.
-        target = new SourceLabel(
+        target = new(isolate()) SourceLabel(
             TokenPos(), target_name, SourceLabel::kForward);
         switch_scope->AddLabel(target);
       }
@@ -7261,7 +7330,7 @@
     ErrorMsg(jump_pos, "'%s' target must be in same function context",
              Token::Str(jump_kind));
   }
-  return new JumpNode(jump_pos, jump_kind, target);
+  return new(isolate()) JumpNode(jump_pos, jump_kind, target);
 }
 
 
@@ -7281,18 +7350,19 @@
     }
   }
   const intptr_t statement_pos = TokenPos();
+  const Token::Kind token = CurrentToken();
 
-  if (CurrentToken() == Token::kWHILE) {
+  if (token == Token::kWHILE) {
     statement = ParseWhileStatement(label_name);
-  } else if (CurrentToken() == Token::kFOR) {
+  } else if (token == Token::kFOR) {
     statement = ParseForStatement(label_name);
-  } else if (CurrentToken() == Token::kDO) {
+  } else if (token == Token::kDO) {
     statement = ParseDoWhileStatement(label_name);
-  } else if (CurrentToken() == Token::kSWITCH) {
+  } else if (token == Token::kSWITCH) {
     statement = ParseSwitchStatement(label_name);
-  } else if (CurrentToken() == Token::kTRY) {
+  } else if (token == Token::kTRY) {
     statement = ParseTryStatement(label_name);
-  } else if (CurrentToken() == Token::kRETURN) {
+  } else if (token == Token::kRETURN) {
     const intptr_t return_pos = TokenPos();
     ConsumeToken();
     if (CurrentToken() != Token::kSEMICOLON) {
@@ -7301,15 +7371,15 @@
         ErrorMsg(return_pos, "return of a value not allowed in constructors");
       }
       AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
-      statement = new ReturnNode(statement_pos, expr);
+      statement = new(isolate()) ReturnNode(statement_pos, expr);
     } else {
-      statement = new ReturnNode(statement_pos);
+      statement = new(isolate()) ReturnNode(statement_pos);
     }
     AddNodeForFinallyInlining(statement);
     ExpectSemicolon();
-  } else if (CurrentToken() == Token::kIF) {
+  } else if (token == Token::kIF) {
     statement = ParseIfStatement(label_name);
-  } else if (CurrentToken() == Token::kASSERT) {
+  } else if (token == Token::kASSERT) {
     statement = ParseAssertStatement();
     ExpectSemicolon();
   } else if (IsVariableDeclaration()) {
@@ -7317,7 +7387,7 @@
     ExpectSemicolon();
   } else if (IsFunctionDeclaration()) {
     statement = ParseFunctionStatement(false);
-  } else if (CurrentToken() == Token::kLBRACE) {
+  } else if (token == Token::kLBRACE) {
     SourceLabel* label = NULL;
     OpenBlock();
     if (label_name != NULL) {
@@ -7331,18 +7401,18 @@
       statement->AsSequenceNode()->set_label(label);
     }
     ExpectToken(Token::kRBRACE);
-  } else if (CurrentToken() == Token::kBREAK) {
+  } else if (token == Token::kBREAK) {
     statement = ParseJump(label_name);
     AddNodeForFinallyInlining(statement);
     ExpectSemicolon();
-  } else if (CurrentToken() == Token::kCONTINUE) {
+  } else if (token == Token::kCONTINUE) {
     statement = ParseJump(label_name);
     AddNodeForFinallyInlining(statement);
     ExpectSemicolon();
-  } else if (CurrentToken() == Token::kSEMICOLON) {
+  } else if (token == Token::kSEMICOLON) {
     // Empty statement, nothing to do.
     ConsumeToken();
-  } else if (CurrentToken() == Token::kRETHROW) {
+  } else if (token == Token::kRETHROW) {
     // Rethrow of current exception.
     ConsumeToken();
     ExpectSemicolon();
@@ -7360,9 +7430,10 @@
     LocalVariable* trace_var =
         scope->LocalLookupVariable(Symbols::StackTraceVar());
     ASSERT(trace_var != NULL);
-    statement = new ThrowNode(statement_pos,
-                              new LoadLocalNode(statement_pos, excp_var),
-                              new LoadLocalNode(statement_pos, trace_var));
+    statement = new(isolate()) ThrowNode(
+        statement_pos,
+        new(isolate()) LoadLocalNode(statement_pos, excp_var),
+        new(isolate()) LoadLocalNode(statement_pos, trace_var));
   } else {
     statement = ParseExpr(kAllowConst, kConsumeCascades);
     ExpectSemicolon();
@@ -7374,8 +7445,8 @@
 void Parser::ErrorMsg(intptr_t token_pos, const char* format, ...) const {
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(LanguageError::NewFormattedV(
-      Error::Handle(), script_, token_pos,
+  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
+      Error::Handle(isolate()), script_, token_pos,
       LanguageError::kError, Heap::kNew, format, args));
   va_end(args);
   isolate()->long_jump_base()->Jump(1, error);
@@ -7386,8 +7457,8 @@
 void Parser::ErrorMsg(const char* format, ...) {
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(LanguageError::NewFormattedV(
-      Error::Handle(), script_, TokenPos(),
+  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
+      Error::Handle(isolate()), script_, TokenPos(),
       LanguageError::kError, Heap::kNew, format, args));
   va_end(args);
   isolate()->long_jump_base()->Jump(1, error);
@@ -7405,11 +7476,10 @@
       const Error& prev_error, intptr_t token_pos, const char* format, ...) {
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(
-      LanguageError::NewFormattedV(
-          prev_error, script_, token_pos,
-          LanguageError::kError, Heap::kNew,
-          format, args));
+  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
+      prev_error, script_, token_pos,
+      LanguageError::kError, Heap::kNew,
+      format, args));
   va_end(args);
   isolate()->long_jump_base()->Jump(1, error);
   UNREACHABLE();
@@ -7420,11 +7490,10 @@
   if (FLAG_silent_warnings) return;
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(
-      LanguageError::NewFormattedV(
-          Error::Handle(), script_, token_pos,
-          LanguageError::kWarning, Heap::kNew,
-          format, args));
+  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
+      Error::Handle(isolate()), script_, token_pos,
+      LanguageError::kWarning, Heap::kNew,
+      format, args));
   va_end(args);
   if (FLAG_warning_as_error) {
     isolate()->long_jump_base()->Jump(1, error);
@@ -7439,11 +7508,10 @@
   if (FLAG_silent_warnings) return;
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(
-      LanguageError::NewFormattedV(
-          Error::Handle(), script_, TokenPos(),
-          LanguageError::kWarning, Heap::kNew,
-          format, args));
+  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
+      Error::Handle(isolate()), script_, TokenPos(),
+      LanguageError::kWarning, Heap::kNew,
+      format, args));
   va_end(args);
   if (FLAG_warning_as_error) {
     isolate()->long_jump_base()->Jump(1, error);
@@ -7549,20 +7617,20 @@
 
 
 AstNode* Parser::ThrowTypeError(intptr_t type_pos, const AbstractType& type) {
-  ArgumentListNode* arguments = new ArgumentListNode(type_pos);
+  ArgumentListNode* arguments = new(isolate()) ArgumentListNode(type_pos);
   // Location argument.
-  arguments->Add(new LiteralNode(
-      type_pos, Integer::ZoneHandle(Integer::New(type_pos))));
+  arguments->Add(new(isolate()) LiteralNode(
+      type_pos, Integer::ZoneHandle(I, Integer::New(type_pos))));
   // Src value argument.
-  arguments->Add(new LiteralNode(type_pos, Instance::ZoneHandle()));
+  arguments->Add(new(isolate()) LiteralNode(type_pos, Instance::ZoneHandle(I)));
   // Dst type name argument.
-  arguments->Add(new LiteralNode(type_pos, Symbols::Malformed()));
+  arguments->Add(new(isolate()) LiteralNode(type_pos, Symbols::Malformed()));
   // Dst name argument.
-  arguments->Add(new LiteralNode(type_pos, Symbols::Empty()));
+  arguments->Add(new(isolate()) LiteralNode(type_pos, Symbols::Empty()));
   // Malformed type error or malbounded type error.
-  const Error& error = Error::Handle(type.error());
+  const Error& error = Error::Handle(isolate(), type.error());
   ASSERT(!error.IsNull());
-  arguments->Add(new LiteralNode(type_pos, String::ZoneHandle(
+  arguments->Add(new(isolate()) LiteralNode(type_pos, String::ZoneHandle(I,
       Symbols::New(error.ToErrorCString()))));
   return MakeStaticCall(Symbols::TypeError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -7576,41 +7644,48 @@
                                         ArgumentListNode* function_arguments,
                                         InvocationMirror::Call im_call,
                                         InvocationMirror::Type im_type,
-                                        Function* func) {
-  ArgumentListNode* arguments = new ArgumentListNode(call_pos);
+                                        const Function* func) {
+  ArgumentListNode* arguments = new(isolate()) ArgumentListNode(call_pos);
   // Object receiver.
-  // TODO(regis): For now, we pass a class literal of the unresolved
-  // method's owner, but this is not specified and will probably change.
-  Type& type = Type::ZoneHandle(
-      Type::New(cls, TypeArguments::Handle(), call_pos, Heap::kOld));
-  type ^= ClassFinalizer::FinalizeType(
-      current_class(), type, ClassFinalizer::kCanonicalize);
-  arguments->Add(new LiteralNode(call_pos, type));
+  // If the function is external and dynamic, pass the actual receiver,
+  // otherwise, pass a class literal of the unresolved method's owner.
+  if ((func != NULL) && !func->IsNull() &&
+      func->is_external() && !func->is_static()) {
+    arguments->Add(LoadReceiver(func->token_pos()));
+  } else {
+    Type& type = Type::ZoneHandle(I,
+        Type::New(cls, TypeArguments::Handle(isolate()), call_pos, Heap::kOld));
+    type ^= ClassFinalizer::FinalizeType(
+        current_class(), type, ClassFinalizer::kCanonicalize);
+    arguments->Add(new(isolate()) LiteralNode(call_pos, type));
+  }
   // String memberName.
-  arguments->Add(new LiteralNode(
-      call_pos, String::ZoneHandle(Symbols::New(function_name))));
+  arguments->Add(new(isolate()) LiteralNode(
+      call_pos, String::ZoneHandle(I, Symbols::New(function_name))));
   // Smi invocation_type.
   if (cls.IsTopLevel()) {
     ASSERT(im_call == InvocationMirror::kStatic ||
            im_call == InvocationMirror::kTopLevel);
     im_call = InvocationMirror::kTopLevel;
   }
-  arguments->Add(new LiteralNode(call_pos, Smi::ZoneHandle(
+  arguments->Add(new(isolate()) LiteralNode(call_pos, Smi::ZoneHandle(I,
       Smi::New(InvocationMirror::EncodeType(im_call, im_type)))));
   // List arguments.
   if (function_arguments == NULL) {
-    arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle()));
+    arguments->Add(new(isolate()) LiteralNode(call_pos, Array::ZoneHandle(I)));
   } else {
-    ArrayNode* array = new ArrayNode(call_pos,
-                                     Type::ZoneHandle(Type::ArrayType()),
-                                     function_arguments->nodes());
+    ArrayNode* array = new(isolate()) ArrayNode(
+        call_pos,
+        Type::ZoneHandle(I, Type::ArrayType()),
+        function_arguments->nodes());
     arguments->Add(array);
   }
   // List argumentNames.
   if (function_arguments == NULL) {
-    arguments->Add(new LiteralNode(call_pos, Array::ZoneHandle()));
+    arguments->Add(new(isolate()) LiteralNode(call_pos, Array::ZoneHandle(I)));
   } else {
-    arguments->Add(new LiteralNode(call_pos, function_arguments->names()));
+    arguments->Add(new(isolate()) LiteralNode(
+        call_pos, function_arguments->names()));
   }
 
   // List existingArgumentNames.
@@ -7618,14 +7693,15 @@
   // has done the lookup already. If there is a function with the same
   // name but incompatible parameters, inform the NoSuchMethodError what the
   // expected parameters are.
-  Function& function = Function::Handle();
+  Function& function = Function::Handle(isolate());
   if (func != NULL) {
     function = func->raw();
   } else {
     function = cls.LookupStaticFunction(function_name);
   }
-  Array& array = Array::ZoneHandle();
-  if (!function.IsNull()) {
+  Array& array = Array::ZoneHandle(I);
+  // An unpatched external function is treated as an unresolved function.
+  if (!function.IsNull() && !function.is_external()) {
     // The constructor for NoSuchMethodError takes a list of existing
     // parameter names to produce a descriptive error message explaining
     // the parameter mismatch. The problem is that the array of names
@@ -7639,9 +7715,10 @@
     // between dart2js and VM. Update the constructor to accept a string
     // describing the formal parameters of an incompatible call target.
     array = Array::New(1, Heap::kOld);
-    array.SetAt(0, String::Handle(function.UserVisibleFormalParameters()));
+    array.SetAt(0, String::Handle(isolate(),
+        function.UserVisibleFormalParameters()));
   }
-  arguments->Add(new LiteralNode(call_pos, array));
+  arguments->Add(new(isolate()) LiteralNode(call_pos, array));
 
   return MakeStaticCall(Symbols::NoSuchMethodError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -7673,14 +7750,14 @@
           op_kind = Token::kISNOT;
         }
         const intptr_t type_pos = TokenPos();
-        const AbstractType& type = AbstractType::ZoneHandle(
+        const AbstractType& type = AbstractType::ZoneHandle(I,
             ParseType(ClassFinalizer::kCanonicalize));
         if (!type.IsInstantiated() &&
             (current_block_->scope->function_level() > 0)) {
           // Make sure that the instantiator is captured.
           CaptureInstantiator();
         }
-        right_operand = new TypeNode(type_pos, type);
+        right_operand = new(isolate()) TypeNode(type_pos, type);
         // In production mode, the type may be malformed.
         // In checked mode, the type may be malformed or malbounded.
         if (((op_kind == Token::kIS) || (op_kind == Token::kISNOT) ||
@@ -7690,7 +7767,7 @@
           // a type cast even if the tested value is null.
           // We need to evaluate the left operand for potential
           // side effects.
-          LetNode* let = new LetNode(left_operand->token_pos());
+          LetNode* let = new(isolate()) LetNode(left_operand->token_pos());
           let->AddNode(left_operand);
           let->AddNode(ThrowTypeError(type_pos, type));
           left_operand = let;
@@ -7707,7 +7784,7 @@
             EnsureExpressionTemp();
           }
         }
-        left_operand = new ComparisonNode(
+        left_operand = new(isolate()) ComparisonNode(
             op_pos, op_kind, left_operand, right_operand);
         break;  // Equality and relational operators cannot be chained.
       } else {
@@ -7726,7 +7803,7 @@
   AstNode* expressions = ParseExpr(kAllowConst, kConsumeCascades);
   if (CurrentToken() == Token::kCOMMA) {
     // Collect comma-separated expressions in a non scope owning sequence node.
-    SequenceNode* list = new SequenceNode(TokenPos(), NULL);
+    SequenceNode* list = new(isolate()) SequenceNode(TokenPos(), NULL);
     list->Add(expressions);
     while (CurrentToken() == Token::kCOMMA) {
       ConsumeToken();
@@ -7748,10 +7825,10 @@
 void Parser::EnsureSavedCurrentContext() {
   // Used later by the flow_graph_builder to save current context.
   if (!parsed_function()->has_saved_current_context_var()) {
-    LocalVariable* temp =
-        new LocalVariable(current_function().token_pos(),
-                          Symbols::SavedCurrentContextVar(),
-                          Type::ZoneHandle(Type::DynamicType()));
+    LocalVariable* temp = new(isolate()) LocalVariable(
+        current_function().token_pos(),
+        Symbols::SavedCurrentContextVar(),
+        Type::ZoneHandle(I, Type::DynamicType()));
     ASSERT(temp != NULL);
     parsed_function()->set_saved_current_context_var(temp);
   }
@@ -7762,10 +7839,10 @@
                                                const char* s) {
   char name[64];
   OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos);
-  LocalVariable* temp =
-      new LocalVariable(token_pos,
-                        String::ZoneHandle(Symbols::New(name)),
-                        Type::ZoneHandle(Type::DynamicType()));
+  LocalVariable* temp = new(isolate()) LocalVariable(
+      token_pos,
+      String::ZoneHandle(I, Symbols::New(name)),
+      Type::ZoneHandle(I, Type::DynamicType()));
   temp->set_is_final();
   current_block_->scope->AddVariable(temp);
   return temp;
@@ -7785,9 +7862,9 @@
       double left_double = Double::Cast(lhs_literal->literal()).value();
       double right_double = Double::Cast(rhs_literal->literal()).value();
       if (binary_op == Token::kDIV) {
-        const Double& dbl_obj = Double::ZoneHandle(
+        const Double& dbl_obj = Double::ZoneHandle(I,
             Double::NewCanonical((left_double / right_double)));
-        return new LiteralNode(op_pos, dbl_obj);
+        return new(isolate()) LiteralNode(op_pos, dbl_obj);
       }
     }
   }
@@ -7810,14 +7887,14 @@
             (lhs->AsBinaryOpNode()->kind() == Token::kSHL)) {
           // Merge SHL and BIT_AND into one "SHL with mask" node.
           BinaryOpNode* old = lhs->AsBinaryOpNode();
-          BinaryOpWithMask32Node* binop = new BinaryOpWithMask32Node(
+          BinaryOpWithMask32Node* binop = new(isolate()) BinaryOpWithMask32Node(
               old->token_pos(), old->kind(), old->left(), old->right(), val);
           return binop;
         }
       }
     }
   }
-  return new BinaryOpNode(op_pos, binary_op, lhs, rhs);
+  return new(isolate()) BinaryOpNode(op_pos, binary_op, lhs, rhs);
 }
 
 
@@ -7830,27 +7907,27 @@
     case Token::kASSIGN:
       return rhs;
     case Token::kASSIGN_ADD:
-      return new BinaryOpNode(op_pos, Token::kADD, lhs, rhs);
+      return new(isolate()) BinaryOpNode(op_pos, Token::kADD, lhs, rhs);
     case Token::kASSIGN_SUB:
-      return new BinaryOpNode(op_pos, Token::kSUB, lhs, rhs);
+      return new(isolate()) BinaryOpNode(op_pos, Token::kSUB, lhs, rhs);
     case Token::kASSIGN_MUL:
-      return new BinaryOpNode(op_pos, Token::kMUL, lhs, rhs);
+      return new(isolate()) BinaryOpNode(op_pos, Token::kMUL, lhs, rhs);
     case Token::kASSIGN_TRUNCDIV:
-      return new BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs);
+      return new(isolate()) BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs);
     case Token::kASSIGN_DIV:
-      return new BinaryOpNode(op_pos, Token::kDIV, lhs, rhs);
+      return new(isolate()) BinaryOpNode(op_pos, Token::kDIV, lhs, rhs);
     case Token::kASSIGN_MOD:
-      return new BinaryOpNode(op_pos, Token::kMOD, lhs, rhs);
+      return new(isolate()) BinaryOpNode(op_pos, Token::kMOD, lhs, rhs);
     case Token::kASSIGN_SHR:
-      return new BinaryOpNode(op_pos, Token::kSHR, lhs, rhs);
+      return new(isolate()) BinaryOpNode(op_pos, Token::kSHR, lhs, rhs);
     case Token::kASSIGN_SHL:
-      return new BinaryOpNode(op_pos, Token::kSHL, lhs, rhs);
+      return new(isolate()) BinaryOpNode(op_pos, Token::kSHL, lhs, rhs);
     case Token::kASSIGN_OR:
-      return new BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs);
+      return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs);
     case Token::kASSIGN_AND:
-      return new BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs);
+      return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs);
     case Token::kASSIGN_XOR:
-      return new BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs);
+      return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs);
     default:
       ErrorMsg(op_pos, "internal error: ExpandAssignableOp '%s' unimplemented",
           Token::Name(assignment_op));
@@ -7869,28 +7946,29 @@
   if (expr->EvalConstExpr() == NULL) {
     ErrorMsg(expr_pos, "expression is not a valid compile-time constant");
   }
-  return new LiteralNode(expr_pos, EvaluateConstExpr(expr_pos, expr));
+  return new(isolate()) LiteralNode(
+      expr_pos, EvaluateConstExpr(expr_pos, expr));
 }
 
 
 LetNode* Parser::PrepareCompoundAssignmentNodes(AstNode** expr) {
   AstNode* node = *expr;
   intptr_t token_pos = node->token_pos();
-  LetNode* result = new LetNode(token_pos);
+  LetNode* result = new(isolate()) LetNode(token_pos);
   if (node->IsLoadIndexedNode()) {
     LoadIndexedNode* load_indexed = node->AsLoadIndexedNode();
     AstNode* array = load_indexed->array();
     AstNode* index = load_indexed->index_expr();
     if (!IsSimpleLocalOrLiteralNode(load_indexed->array())) {
       LocalVariable* t0 = result->AddInitializer(load_indexed->array());
-      array = new LoadLocalNode(token_pos, t0);
+      array = new(isolate()) LoadLocalNode(token_pos, t0);
     }
     if (!IsSimpleLocalOrLiteralNode(load_indexed->index_expr())) {
       LocalVariable* t1 = result->AddInitializer(
           load_indexed->index_expr());
-      index = new LoadLocalNode(token_pos, t1);
+      index = new(isolate()) LoadLocalNode(token_pos, t1);
     }
-    *expr = new LoadIndexedNode(token_pos,
+    *expr = new(isolate()) LoadIndexedNode(token_pos,
                                 array,
                                 index,
                                 load_indexed->super_class());
@@ -7901,11 +7979,11 @@
     AstNode* receiver = getter->receiver();
     if (!IsSimpleLocalOrLiteralNode(getter->receiver())) {
       LocalVariable* t0 = result->AddInitializer(getter->receiver());
-      receiver = new LoadLocalNode(token_pos, t0);
+      receiver = new(isolate()) LoadLocalNode(token_pos, t0);
     }
-    *expr = new InstanceGetterNode(token_pos,
-                                   receiver,
-                                   getter->field_name());
+    *expr = new(isolate()) InstanceGetterNode(token_pos,
+                                              receiver,
+                                              getter->field_name());
     return result;
   }
   return result;
@@ -7940,14 +8018,14 @@
                                       intptr_t left_pos) {
   AstNode* result = original->MakeAssignmentNode(rhs);
   if (result == NULL) {
-    String& name = String::ZoneHandle();
+    String& name = String::ZoneHandle(I);
     const Class* target_cls = &current_class();
     if (original->IsTypeNode()) {
       name = Symbols::New(original->AsTypeNode()->TypeName());
     } else if (original->IsLoadStaticFieldNode()) {
       name = original->AsLoadStaticFieldNode()->field().name();
-      target_cls =
-          &Class::Handle(original->AsLoadStaticFieldNode()->field().owner());
+      target_cls = &Class::Handle(isolate(),
+          original->AsLoadStaticFieldNode()->field().owner());
     } else if ((left_ident != NULL) &&
                (original->IsLiteralNode() ||
                 original->IsLoadLocalNode())) {
@@ -7979,12 +8057,12 @@
 
 AstNode* Parser::ParseCascades(AstNode* expr) {
   intptr_t cascade_pos = TokenPos();
-  LetNode* cascade = new LetNode(cascade_pos);
+  LetNode* cascade = new(isolate()) LetNode(cascade_pos);
   LocalVariable* cascade_receiver_var = cascade->AddInitializer(expr);
   while (CurrentToken() == Token::kCASCADE) {
     cascade_pos = TokenPos();
     LoadLocalNode* load_cascade_receiver =
-        new LoadLocalNode(cascade_pos, cascade_receiver_var);
+        new(isolate()) LoadLocalNode(cascade_pos, cascade_receiver_var);
     if (Token::IsIdentifier(LookaheadToken(1))) {
       // Replace .. with . for ParseSelectors().
       token_kind_ = Token::kPERIOD;
@@ -8029,20 +8107,21 @@
   }
   // The result is an expression with the (side effects of the) cascade
   // sequence followed by the (value of the) receiver temp variable load.
-  cascade->AddNode(new LoadLocalNode(cascade_pos, cascade_receiver_var));
+  cascade->AddNode(new(isolate()) LoadLocalNode(
+      cascade_pos, cascade_receiver_var));
   return cascade;
 }
 
 
 // Convert loading of a static const field into a literal node.
-static AstNode* LiteralIfStaticConst(AstNode* expr) {
+static AstNode* LiteralIfStaticConst(Isolate* iso, AstNode* expr) {
   if (expr->IsLoadStaticFieldNode()) {
     const Field& field = expr->AsLoadStaticFieldNode()->field();
     if (field.is_const()) {
       ASSERT(field.value() != Object::sentinel().raw());
       ASSERT(field.value() != Object::transition_sentinel().raw());
-      return new LiteralNode(expr->token_pos(),
-                             Instance::ZoneHandle(field.value()));
+      return new(iso) LiteralNode(expr->token_pos(),
+                             Instance::ZoneHandle(iso, field.value()));
     }
   }
   return expr;
@@ -8062,7 +8141,7 @@
       ErrorMsg("expression expected after throw");
     }
     AstNode* expr = ParseExpr(require_compiletime_const, consume_cascades);
-    return new ThrowNode(expr_pos, expr, NULL);
+    return new(isolate()) ThrowNode(expr_pos, expr, NULL);
   }
   AstNode* expr = ParseConditionalExpr();
   if (!Token::IsAssignmentOperator(CurrentToken())) {
@@ -8072,7 +8151,7 @@
     if (require_compiletime_const) {
       expr = FoldConstExpr(expr_pos, expr);
     } else {
-      expr = LiteralIfStaticConst(expr);
+      expr = LiteralIfStaticConst(I, expr);
     }
     return expr;
   }
@@ -8099,7 +8178,7 @@
     let_expr->AddNode(assign_expr);
     return let_expr;
   } else {
-    AstNode* assigned_value = LiteralIfStaticConst(right_expr);
+    AstNode* assigned_value = LiteralIfStaticConst(I, right_expr);
     AstNode* assign_expr =
         CreateAssignmentNode(expr, assigned_value, expr_ident, expr_pos);
     ASSERT(assign_expr != NULL);
@@ -8129,7 +8208,7 @@
     AstNode* expr1 = ParseExpr(kAllowConst, kNoCascades);
     ExpectToken(Token::kCOLON);
     AstNode* expr2 = ParseExpr(kAllowConst, kNoCascades);
-    expr = new ConditionalExprNode(expr_pos, expr, expr1, expr2);
+    expr = new(isolate()) ConditionalExprNode(expr_pos, expr, expr1, expr2);
   }
   return expr;
 }
@@ -8165,11 +8244,11 @@
     LetNode* let_expr = PrepareCompoundAssignmentNodes(&expr);
     Token::Kind binary_op =
         (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new BinaryOpNode(
+    BinaryOpNode* add = new(isolate()) BinaryOpNode(
         op_pos,
         binary_op,
         expr,
-        new LiteralNode(op_pos, Smi::ZoneHandle(Smi::New(1))));
+        new(isolate()) LiteralNode(op_pos, Smi::ZoneHandle(I, Smi::New(1))));
     AstNode* store = CreateAssignmentNode(expr, add, expr_ident, expr_pos);
     ASSERT(store != NULL);
     let_expr->AddNode(store);
@@ -8189,15 +8268,15 @@
   const bool saved_mode = SetAllowFunctionLiterals(true);
   ArgumentListNode* arguments;
   if (implicit_arguments == NULL) {
-    arguments = new ArgumentListNode(TokenPos());
+    arguments = new(isolate()) ArgumentListNode(TokenPos());
   } else {
     arguments = implicit_arguments;
   }
-  const GrowableObjectArray& names =
-      GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld));
+  const GrowableObjectArray& names = GrowableObjectArray::Handle(isolate(),
+      GrowableObjectArray::New(Heap::kOld));
   bool named_argument_seen = false;
   if (LookaheadToken(1) != Token::kRPAREN) {
-    String& arg_name = String::Handle();
+    String& arg_name = String::Handle(isolate());
     do {
       ASSERT((CurrentToken() == Token::kLPAREN) ||
              (CurrentToken() == Token::kCOMMA));
@@ -8228,7 +8307,7 @@
   ExpectToken(Token::kRPAREN);
   SetAllowFunctionLiterals(saved_mode);
   if (named_argument_seen) {
-    arguments->set_names(Array::Handle(Array::MakeArray(names)));
+    arguments->set_names(Array::Handle(isolate(), Array::MakeArray(names)));
   }
   return arguments;
 }
@@ -8242,7 +8321,7 @@
   ASSERT(CurrentToken() == Token::kLPAREN);
   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst);
   const int num_arguments = arguments->length();
-  const Function& func = Function::ZoneHandle(
+  const Function& func = Function::ZoneHandle(I,
       Resolver::ResolveStatic(cls,
                               func_name,
                               num_arguments,
@@ -8251,12 +8330,12 @@
     // Check if there is a static field of the same name, it could be a closure
     // and so we try and invoke the closure.
     AstNode* closure = NULL;
-    const Field& field = Field::ZoneHandle(cls.LookupStaticField(func_name));
-    Function& func = Function::ZoneHandle();
+    const Field& field = Field::ZoneHandle(I, cls.LookupStaticField(func_name));
+    Function& func = Function::ZoneHandle(I);
     if (field.IsNull()) {
       // No field, check if we have an explicit getter function.
       const String& getter_name =
-          String::ZoneHandle(Field::GetterName(func_name));
+          String::ZoneHandle(I, Field::GetterName(func_name));
       const int kNumArguments = 0;  // no arguments.
       func = Resolver::ResolveStatic(cls,
                                      getter_name,
@@ -8264,11 +8343,12 @@
                                      Object::empty_array());
       if (!func.IsNull()) {
         ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-        closure = new StaticGetterNode(call_pos,
-                                       NULL,
-                                       false,
-                                       Class::ZoneHandle(cls.raw()),
-                                       func_name);
+        closure = new(isolate()) StaticGetterNode(
+            call_pos,
+            NULL,
+            false,
+            Class::ZoneHandle(I, cls.raw()),
+            func_name);
         return BuildClosureCall(call_pos, closure, arguments);
       }
     } else {
@@ -8289,12 +8369,12 @@
     // This is the predefined toplevel function identical(a,b). Create
     // a comparison node instead.
     ASSERT(num_arguments == 2);
-    return new ComparisonNode(ident_pos,
-                              Token::kEQ_STRICT,
-                              arguments->NodeAt(0),
-                              arguments->NodeAt(1));
+    return new(isolate()) ComparisonNode(ident_pos,
+                                         Token::kEQ_STRICT,
+                                         arguments->NodeAt(0),
+                                         arguments->NodeAt(1));
   }
-  return new StaticCallNode(call_pos, func, arguments);
+  return new(isolate()) StaticCallNode(call_pos, func, arguments);
 }
 
 
@@ -8303,7 +8383,8 @@
   const intptr_t call_pos = TokenPos();
   CheckToken(Token::kLPAREN);
   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst);
-  return new InstanceCallNode(call_pos, receiver, func_name, arguments);
+  return new(isolate()) InstanceCallNode(
+      call_pos, receiver, func_name, arguments);
 }
 
 
@@ -8328,21 +8409,23 @@
   }
   // The field is initialized.
   ASSERT(field.is_static());
-  const Class& field_owner = Class::ZoneHandle(field.owner());
-  const String& field_name = String::ZoneHandle(field.name());
-  const String& getter_name = String::Handle(Field::GetterName(field_name));
-  const Function& getter =
-      Function::Handle(field_owner.LookupStaticFunction(getter_name));
+  const Class& field_owner = Class::ZoneHandle(I, field.owner());
+  const String& field_name = String::ZoneHandle(I, field.name());
+  const String& getter_name = String::Handle(isolate(),
+      Field::GetterName(field_name));
+  const Function& getter = Function::Handle(isolate(),
+      field_owner.LookupStaticFunction(getter_name));
   // Never load field directly if there is a getter (deterministic AST).
   if (getter.IsNull() || field.is_const()) {
-    return new LoadStaticFieldNode(ident_pos, Field::ZoneHandle(field.raw()));
+    return new(isolate()) LoadStaticFieldNode(
+        ident_pos, Field::ZoneHandle(I, field.raw()));
   } else {
     ASSERT(getter.kind() == RawFunction::kImplicitStaticFinalGetter);
-    return new StaticGetterNode(ident_pos,
-                                NULL,  // Receiver.
-                                false,  // is_super_getter.
-                                field_owner,
-                                field_name);
+    return new(isolate()) StaticGetterNode(ident_pos,
+                                           NULL,  // Receiver.
+                                           false,  // is_super_getter.
+                                           field_owner,
+                                           field_name);
   }
 }
 
@@ -8353,12 +8436,12 @@
                                         bool consume_cascades) {
   TRACE_PARSER("ParseStaticFieldAccess");
   AstNode* access = NULL;
-  const Field& field = Field::ZoneHandle(cls.LookupStaticField(field_name));
-  Function& func = Function::ZoneHandle();
+  const Field& field = Field::ZoneHandle(I, cls.LookupStaticField(field_name));
+  Function& func = Function::ZoneHandle(I);
   if (field.IsNull()) {
     // No field, check if we have an explicit getter function.
     const String& getter_name =
-        String::ZoneHandle(Field::GetterName(field_name));
+        String::ZoneHandle(I, Field::GetterName(field_name));
     const int kNumArguments = 0;  // no arguments.
     func = Resolver::ResolveStatic(cls,
                                    getter_name,
@@ -8376,19 +8459,16 @@
         // Create a getter call, which may later be turned into
         // a setter call, or else the backend will generate
         // a throw NoSuchMethodError().
-        access = new StaticGetterNode(ident_pos,
-                                      NULL,
-                                      false,
-                                      Class::ZoneHandle(cls.raw()),
-                                      field_name);
+        access = new(I) StaticGetterNode(ident_pos,
+                                         NULL,
+                                         false,
+                                         Class::ZoneHandle(I, cls.raw()),
+                                         field_name);
       }
     } else {
       ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-      access = new StaticGetterNode(ident_pos,
-                                    NULL,
-                                    false,
-                                    Class::ZoneHandle(cls.raw()),
-                                    field_name);
+      access = new(isolate()) StaticGetterNode(
+          ident_pos, NULL, false, Class::ZoneHandle(I, cls.raw()), field_name);
     }
   } else {
     access = GenerateStaticFieldLookup(field, ident_pos);
@@ -8420,11 +8500,12 @@
     if (current_function().is_static() ||
         current_function().IsInFactoryScope()) {
       StaticGetterNode* getter =
-          new StaticGetterNode(primary->token_pos(),
-                               NULL,  // No receiver.
-                               false,  // Not a super getter.
-                               Class::ZoneHandle(current_class().raw()),
-                               name);
+          new(isolate()) StaticGetterNode(
+              primary->token_pos(),
+              NULL,  // No receiver.
+              false,  // Not a super getter.
+              Class::ZoneHandle(I, current_class().raw()),
+              name);
       getter->set_is_deferred(primary->is_deferred_reference());
       return getter;
     } else {
@@ -8440,7 +8521,7 @@
   ASSERT(primary->primary().IsFunction());
   const Function& func =
       Function::CheckedZoneHandle(primary->primary().raw());
-  const String& funcname = String::ZoneHandle(func.name());
+  const String& funcname = String::ZoneHandle(I, func.name());
   if (func.is_static()) {
     // Static function access.
     ClosureNode* closure =
@@ -8481,7 +8562,7 @@
           left = LoadClosure(primary_node);
         } else if (primary_node->primary().IsTypeParameter()) {
           if (current_function().is_static()) {
-            const String& name = String::ZoneHandle(
+            const String& name = String::ZoneHandle(I,
                 TypeParameter::Cast(primary_node->primary()).name());
             ErrorMsg(primary_pos,
                      "cannot access type parameter '%s' from static function",
@@ -8491,13 +8572,13 @@
             // Make sure that the instantiator is captured.
             CaptureInstantiator();
           }
-          TypeParameter& type_parameter = TypeParameter::ZoneHandle();
+          TypeParameter& type_parameter = TypeParameter::ZoneHandle(I);
           type_parameter ^= ClassFinalizer::FinalizeType(
               current_class(),
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          left = new TypeNode(primary->token_pos(), type_parameter);
+          left = new(isolate()) TypeNode(primary->token_pos(), type_parameter);
         } else {
           // Super field access handled in ParseSuperFieldAccess(),
           // super calls handled in ParseSuperCall().
@@ -8519,7 +8600,7 @@
         }
       } else {
         // Field access.
-        Class& cls = Class::Handle();
+        Class& cls = Class::Handle(isolate());
         if (left->IsPrimaryNode()) {
           PrimaryNode* primary_node = left->AsPrimaryNode();
           if (primary_node->primary().IsClass()) {
@@ -8556,17 +8637,17 @@
           array = LoadClosure(primary_node);
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(
-              Type::New(type_class, TypeArguments::Handle(),
+          AbstractType& type = Type::ZoneHandle(I,
+              Type::New(type_class, TypeArguments::Handle(isolate()),
                         primary_pos, Heap::kOld));
           type ^= ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          array = new TypeNode(primary_pos, type);
+          array = new(isolate()) TypeNode(primary_pos, type);
         } else if (primary_node->primary().IsTypeParameter()) {
           if (current_function().is_static()) {
-            const String& name = String::ZoneHandle(
+            const String& name = String::ZoneHandle(I,
                 TypeParameter::Cast(primary_node->primary()).name());
             ErrorMsg(primary_pos,
                      "cannot access type parameter '%s' from static function",
@@ -8576,31 +8657,29 @@
             // Make sure that the instantiator is captured.
             CaptureInstantiator();
           }
-          TypeParameter& type_parameter = TypeParameter::ZoneHandle();
+          TypeParameter& type_parameter = TypeParameter::ZoneHandle(I);
           type_parameter ^= ClassFinalizer::FinalizeType(
               current_class(),
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          array = new TypeNode(primary_pos, type_parameter);
+          array = new(isolate()) TypeNode(primary_pos, type_parameter);
         } else {
           UNREACHABLE();  // Internal parser error.
         }
       }
-      selector =  new LoadIndexedNode(bracket_pos,
-                                      array,
-                                      index,
-                                      Class::ZoneHandle());
+      selector =  new(isolate()) LoadIndexedNode(
+          bracket_pos, array, index, Class::ZoneHandle(I));
     } else if (CurrentToken() == Token::kLPAREN) {
       if (left->IsPrimaryNode()) {
         PrimaryNode* primary_node = left->AsPrimaryNode();
         const intptr_t primary_pos = primary_node->token_pos();
         if (primary_node->primary().IsFunction()) {
           const Function& func = Function::Cast(primary_node->primary());
-          const String& func_name = String::ZoneHandle(func.name());
+          const String& func_name = String::ZoneHandle(I, func.name());
           if (func.is_static()) {
             // Parse static function call.
-            Class& cls = Class::Handle(func.Owner());
+            Class& cls = Class::Handle(isolate(), func.Owner());
             selector = ParseStaticCall(cls, func_name, primary_pos);
           } else {
             // Dynamic function call on implicit "this" parameter.
@@ -8632,7 +8711,7 @@
             selector = ParseInstanceCall(LoadReceiver(primary_pos), name);
           }
         } else if (primary_node->primary().IsTypeParameter()) {
-          const String& name = String::ZoneHandle(
+          const String& name = String::ZoneHandle(I,
               TypeParameter::Cast(primary_node->primary()).name());
           if (current_function().is_static()) {
             // Treat as this.T(), because T is in scope.
@@ -8645,13 +8724,13 @@
           }
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(Type::New(
-              type_class, TypeArguments::Handle(), primary_pos));
+          AbstractType& type = Type::ZoneHandle(I, Type::New(
+              type_class, TypeArguments::Handle(isolate()), primary_pos));
           type ^= ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          selector = new TypeNode(primary_pos, type);
+          selector = new(isolate()) TypeNode(primary_pos, type);
         } else {
           UNREACHABLE();  // Internal parser error.
         }
@@ -8679,16 +8758,16 @@
           left = LoadClosure(primary_node);
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
-          AbstractType& type = Type::ZoneHandle(Type::New(
-              type_class, TypeArguments::Handle(), primary_pos));
+          AbstractType& type = Type::ZoneHandle(I, Type::New(
+              type_class, TypeArguments::Handle(isolate()), primary_pos));
           type = ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          left = new TypeNode(primary_pos, type);
+          left = new(isolate()) TypeNode(primary_pos, type);
         } else if (primary_node->primary().IsTypeParameter()) {
           if (current_function().is_static()) {
-            const String& name = String::ZoneHandle(
+            const String& name = String::ZoneHandle(I,
                 TypeParameter::Cast(primary_node->primary()).name());
             ErrorMsg(primary_pos,
                      "cannot access type parameter '%s' from static function",
@@ -8698,13 +8777,13 @@
             // Make sure that the instantiator is captured.
             CaptureInstantiator();
           }
-          TypeParameter& type_parameter = TypeParameter::ZoneHandle();
+          TypeParameter& type_parameter = TypeParameter::ZoneHandle(I);
           type_parameter ^= ClassFinalizer::FinalizeType(
               current_class(),
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          left = new TypeNode(primary_pos, type_parameter);
+          left = new(isolate()) TypeNode(primary_pos, type_parameter);
         } else if (primary_node->IsSuper()) {
           // Return "super" to handle unary super operator calls,
           // or to report illegal use of "super" otherwise.
@@ -8741,17 +8820,17 @@
     LocalVariable* temp = let_expr->AddInitializer(expr);
     Token::Kind binary_op =
         (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new BinaryOpNode(
+    BinaryOpNode* add = new(isolate()) BinaryOpNode(
         expr_pos,
         binary_op,
-        new LoadLocalNode(expr_pos, temp),
-        new LiteralNode(expr_pos, Smi::ZoneHandle(Smi::New(1))));
+        new(isolate()) LoadLocalNode(expr_pos, temp),
+        new(isolate()) LiteralNode(expr_pos, Smi::ZoneHandle(I, Smi::New(1))));
     AstNode* store = CreateAssignmentNode(expr, add, expr_ident, expr_pos);
     ASSERT(store != NULL);
     // The result is a pair of the (side effects of the) store followed by
     // the (value of the) initial value temp variable load.
     let_expr->AddNode(store);
-    let_expr->AddNode(new LoadLocalNode(expr_pos, temp));
+    let_expr->AddNode(new(isolate()) LoadLocalNode(expr_pos, temp));
     return let_expr;
   }
   return expr;
@@ -8933,7 +9012,7 @@
   }
   const char* error_str = NULL;
   Instance& result =
-      Instance::Handle(instance.CheckAndCanonicalize(&error_str));
+      Instance::Handle(isolate(), instance.CheckAndCanonicalize(&error_str));
   if (result.IsNull()) {
     ErrorMsg(token_pos, "Invalid const object %s", error_str);
   }
@@ -8947,8 +9026,8 @@
 AstNode* Parser::RunStaticFieldInitializer(const Field& field,
                                            intptr_t field_ref_pos) {
   ASSERT(field.is_static());
-  const Class& field_owner = Class::ZoneHandle(isolate(), field.owner());
-  const String& field_name = String::ZoneHandle(isolate(), field.name());
+  const Class& field_owner = Class::ZoneHandle(I, field.owner());
+  const String& field_name = String::ZoneHandle(I, field.name());
   const String& getter_name = String::Handle(isolate(),
                                              Field::GetterName(field_name));
   const Function& getter = Function::Handle(
@@ -8960,11 +9039,8 @@
                field_name.ToCString());
     } else {
       // The implicit static getter will throw the exception if necessary.
-      return new StaticGetterNode(field_ref_pos,
-                                  NULL,
-                                  false,
-                                  field_owner,
-                                  field_name);
+      return new(isolate()) StaticGetterNode(
+          field_ref_pos, NULL, false, field_owner, field_name);
     }
   } else if (value.raw() == Object::sentinel().raw()) {
     // This field has not been referenced yet and thus the value has
@@ -8973,11 +9049,11 @@
     if (field.is_const()) {
       field.set_value(Object::transition_sentinel());
       const int kNumArguments = 0;  // no arguments.
-      const Function& func = Function::Handle(
-          isolate(), Resolver::ResolveStatic(field_owner,
-                                             getter_name,
-                                             kNumArguments,
-                                             Object::empty_array()));
+      const Function& func = Function::Handle(isolate(),
+          Resolver::ResolveStatic(field_owner,
+                                  getter_name,
+                                  kNumArguments,
+                                  Object::empty_array()));
       ASSERT(!func.IsNull());
       ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter);
       Object& const_value = Object::Handle(isolate());
@@ -8997,24 +9073,21 @@
           // would raise an exception.
           AppendErrorMsg(error, field_ref_pos,
                          "error initializing const field '%s'",
-                         String::Handle(field.name()).ToCString());
+                         String::Handle(isolate(), field.name()).ToCString());
         } else {
           isolate()->long_jump_base()->Jump(1, error);
           UNREACHABLE();
         }
       }
       ASSERT(const_value.IsNull() || const_value.IsInstance());
-      Instance& instance = Instance::Handle();
+      Instance& instance = Instance::Handle(isolate());
       instance ^= const_value.raw();
       instance = TryCanonicalize(instance, field_ref_pos);
       field.set_value(instance);
       return NULL;   // Constant
     } else {
-      return new StaticGetterNode(field_ref_pos,
-                                  NULL,
-                                  false,
-                                  field_owner,
-                                  field_name);
+      return new(isolate()) StaticGetterNode(
+          field_ref_pos, NULL, false, field_owner, field_name);
     }
   }
   if (getter.IsNull() ||
@@ -9022,11 +9095,8 @@
     return NULL;
   }
   ASSERT(getter.kind() == RawFunction::kImplicitGetter);
-  return new StaticGetterNode(field_ref_pos,
-                              NULL,
-                              false,
-                              field_owner,
-                              field_name);
+  return new(isolate()) StaticGetterNode(
+      field_ref_pos, NULL, false, field_owner, field_name);
 }
 
 
@@ -9049,10 +9119,11 @@
         ErrorMsg("type must be constant in const constructor");
       }
       instance.SetTypeArguments(
-          TypeArguments::Handle(type_arguments.Canonicalize()));
+          TypeArguments::Handle(isolate(), type_arguments.Canonicalize()));
     }
     arg_values.SetAt(0, instance);
-    arg_values.SetAt(1, Smi::Handle(Smi::New(Function::kCtorPhaseAll)));
+    arg_values.SetAt(1, Smi::Handle(isolate(),
+                                    Smi::New(Function::kCtorPhaseAll)));
   } else {
     // Prepend type_arguments to list of arguments to factory.
     ASSERT(type_arguments.IsZoneHandle());
@@ -9111,7 +9182,7 @@
   }
   if (local != NULL) {
     if (node != NULL) {
-      *node = new LoadLocalNode(ident_pos, local);
+      *node = new(isolate()) LoadLocalNode(ident_pos, local);
     }
     return true;
   }
@@ -9149,8 +9220,8 @@
       func.IsStaticFunction() ||
       func.is_abstract())) {
     if (node != NULL) {
-      *node = new PrimaryNode(ident_pos,
-                              Function::ZoneHandle(isolate(), func.raw()));
+      *node = new(isolate()) PrimaryNode(
+          ident_pos, Function::ZoneHandle(I, func.raw()));
     }
     return true;
   }
@@ -9162,13 +9233,15 @@
     if (func.IsDynamicFunction() || func.is_abstract()) {
       if (node != NULL) {
         CheckInstanceFieldAccess(ident_pos, ident);
-        ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(isolate(),
+                                    func.result_type()).IsResolved());
         *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
       }
       return true;
     } else if (func.IsStaticFunction()) {
       if (node != NULL) {
-        ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(isolate(),
+                                    func.result_type()).IsResolved());
         // The static getter may later be changed into a dynamically
         // resolved instance setter if no static setter can
         // be found.
@@ -9183,10 +9256,10 @@
             (LookupReceiver(current_block_->scope, kTestOnly) != NULL)) {
           receiver = LoadReceiver(ident_pos);
         }
-        *node = new StaticGetterNode(ident_pos,
+        *node = new(isolate()) StaticGetterNode(ident_pos,
                                      receiver,
                                      false,
-                                     Class::ZoneHandle(isolate(), cls.raw()),
+                                     Class::ZoneHandle(I, cls.raw()),
                                      ident);
       }
       return true;
@@ -9201,7 +9274,8 @@
         // a setter node. If there is no assignment we will get an error
         // when we try to invoke the getter.
         CheckInstanceFieldAccess(ident_pos, ident);
-        ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(isolate(),
+                                    func.result_type()).IsResolved());
         *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
       }
       return true;
@@ -9211,11 +9285,12 @@
         // it could be followed by an assignment which will convert it to
         // a setter node. If there is no assignment we will get an error
         // when we try to invoke the getter.
-        *node = new StaticGetterNode(ident_pos,
-                                     NULL,
-                                     false,
-                                     Class::ZoneHandle(isolate(), cls.raw()),
-                                     ident);
+        *node = new(isolate()) StaticGetterNode(
+            ident_pos,
+            NULL,
+            false,
+            Class::ZoneHandle(I, cls.raw()),
+            ident);
       }
       return true;
     }
@@ -9231,7 +9306,7 @@
 
 RawClass* Parser::ResolveClassInCurrentLibraryScope(const String& name) {
   HANDLESCOPE(isolate());
-  const Object& obj = Object::Handle(library_.ResolveName(name));
+  const Object& obj = Object::Handle(isolate(), library_.ResolveName(name));
   if (obj.IsClass()) {
     return Class::Cast(obj).raw();
   }
@@ -9246,10 +9321,11 @@
                                                    const String& ident) {
   TRACE_PARSER("ResolveIdentInCurrentLibraryScope");
   HANDLESCOPE(isolate());
-  const Object& obj = Object::Handle(library_.ResolveName(ident));
+  const Object& obj = Object::Handle(isolate(), library_.ResolveName(ident));
   if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
-    return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw()));
+    return new(isolate()) PrimaryNode(
+        ident_pos, Class::ZoneHandle(I, cls.raw()));
   } else if (obj.IsField()) {
     const Field& field = Field::Cast(obj);
     ASSERT(field.is_static());
@@ -9258,27 +9334,28 @@
     const Function& func = Function::Cast(obj);
     ASSERT(func.is_static());
     if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      return new StaticGetterNode(ident_pos,
-                                  /* receiver */ NULL,
-                                  /* is_super_getter */ false,
-                                  Class::ZoneHandle(func.Owner()),
-                                  ident);
+      return new(isolate()) StaticGetterNode(ident_pos,
+                                             /* receiver */ NULL,
+                                             /* is_super_getter */ false,
+                                             Class::ZoneHandle(I, func.Owner()),
+                                             ident);
 
     } else {
-      return new PrimaryNode(ident_pos, Function::ZoneHandle(func.raw()));
+      return new(isolate()) PrimaryNode(ident_pos,
+                                        Function::ZoneHandle(I, func.raw()));
     }
   } else {
     ASSERT(obj.IsNull() || obj.IsLibraryPrefix());
   }
   // Lexically unresolved primary identifiers are referenced by their name.
-  return new PrimaryNode(ident_pos, ident);
+  return new(isolate()) PrimaryNode(ident_pos, ident);
 }
 
 
 RawClass* Parser::ResolveClassInPrefixScope(const LibraryPrefix& prefix,
                                             const String& name) {
   HANDLESCOPE(isolate());
-  const Object& obj = Object::Handle(prefix.LookupObject(name));
+  const Object& obj = Object::Handle(isolate(), prefix.LookupObject(name));
   if (obj.IsClass()) {
     return Class::Cast(obj).raw();
   }
@@ -9294,7 +9371,7 @@
                                            const String& ident) {
   TRACE_PARSER("ResolveIdentInPrefixScope");
   HANDLESCOPE(isolate());
-  Object& obj = Object::Handle();
+  Object& obj = Object::Handle(isolate());
   if (prefix.is_loaded()) {
     obj = prefix.LookupObject(ident);
   } else {
@@ -9312,7 +9389,7 @@
   } else if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
     PrimaryNode* primary =
-        new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw()));
+        new(isolate()) PrimaryNode(ident_pos, Class::ZoneHandle(I, cls.raw()));
     primary->set_is_deferred(is_deferred);
     return primary;
   } else if (obj.IsField()) {
@@ -9333,16 +9410,16 @@
     ASSERT(func.is_static());
     if (func.IsGetterFunction() || func.IsSetterFunction()) {
       StaticGetterNode* getter =
-          new StaticGetterNode(ident_pos,
+          new(isolate()) StaticGetterNode(ident_pos,
                                /* receiver */ NULL,
                                /* is_super_getter */ false,
-                               Class::ZoneHandle(func.Owner()),
+                               Class::ZoneHandle(I, func.Owner()),
                                ident);
       getter->set_is_deferred(is_deferred);
       return getter;
     } else {
-      PrimaryNode* primary =
-          new PrimaryNode(ident_pos, Function::ZoneHandle(func.raw()));
+      PrimaryNode* primary = new(isolate()) PrimaryNode(
+           ident_pos, Function::ZoneHandle(I, func.raw()));
       primary->set_is_deferred(is_deferred);
       return primary;
     }
@@ -9369,7 +9446,7 @@
   if (resolved == NULL) {
     // Check whether the identifier is a type parameter.
     if (!current_class().IsNull()) {
-      TypeParameter& type_parameter = TypeParameter::ZoneHandle(
+      TypeParameter& type_parameter = TypeParameter::ZoneHandle(I,
           current_class().LookupTypeParameter(ident));
       if (!type_parameter.IsNull()) {
         if (current_block_->scope->function_level() > 0) {
@@ -9379,7 +9456,7 @@
         type_parameter ^= ClassFinalizer::FinalizeType(
             current_class(), type_parameter, ClassFinalizer::kCanonicalize);
         ASSERT(!type_parameter.IsMalformed());
-        return new TypeNode(ident_pos, type_parameter);
+        return new(isolate()) TypeNode(ident_pos, type_parameter);
       }
     }
     // Not found in the local scope, and the name is not a type parameter.
@@ -9417,13 +9494,13 @@
       }
     } else if (primary->primary().IsClass()) {
       const Class& type_class = Class::Cast(primary->primary());
-      AbstractType& type = Type::ZoneHandle(
-          Type::New(type_class, TypeArguments::Handle(), primary_pos));
+      AbstractType& type = Type::ZoneHandle(I,
+          Type::New(type_class, TypeArguments::Handle(isolate()), primary_pos));
       type ^= ClassFinalizer::FinalizeType(
           current_class(), type, ClassFinalizer::kCanonicalize);
       // Type may be malbounded, but not malformed.
       ASSERT(!type.IsMalformed());
-      resolved = new TypeNode(primary_pos, type);
+      resolved = new(isolate()) TypeNode(primary_pos, type);
     }
   }
   return resolved;
@@ -9454,7 +9531,7 @@
       // The type is malformed. Skip over its type arguments.
       ParseTypeArguments(ClassFinalizer::kIgnore);
       return ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(),  // No previous error.
+          Error::Handle(isolate()),  // No previous error.
           script_,
           type_name.ident_pos,
           "using '%s' in this context is invalid",
@@ -9465,11 +9542,11 @@
         !allow_deferred_type) {
       ParseTypeArguments(ClassFinalizer::kIgnore);
       return ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(),  // No previous error.
+          Error::Handle(isolate()),  // No previous error.
           script_,
           type_name.ident_pos,
           "using deferred type '%s.%s' is invalid",
-          String::Handle(type_name.lib_prefix->name()).ToCString(),
+          String::Handle(isolate(), type_name.lib_prefix->name()).ToCString(),
           type_name.ident->ToCString());
     }
   }
@@ -9505,7 +9582,8 @@
     intptr_t pos, const Function& constructor,
     const TypeArguments& type_arguments) {
   if (!type_arguments.IsNull()) {
-    const Class& constructor_class = Class::Handle(constructor.Owner());
+    const Class& constructor_class = Class::Handle(isolate(),
+                                                   constructor.Owner());
     ASSERT(!constructor_class.IsNull());
     ASSERT(constructor_class.is_finalized());
     ASSERT(type_arguments.IsCanonical());
@@ -9532,9 +9610,9 @@
   bool is_empty_literal = CurrentToken() == Token::kINDEX;
   ConsumeToken();
 
-  AbstractType& element_type = Type::ZoneHandle(Type::DynamicType());
+  AbstractType& element_type = Type::ZoneHandle(I, Type::DynamicType());
   TypeArguments& list_type_arguments =
-      TypeArguments::ZoneHandle(type_arguments.raw());
+      TypeArguments::ZoneHandle(I, type_arguments.raw());
   // If no type argument vector is provided, leave it as null, which is
   // equivalent to using dynamic as the type argument for the element type.
   if (!list_type_arguments.IsNull()) {
@@ -9562,9 +9640,9 @@
     }
   }
   ASSERT(list_type_arguments.IsNull() || (list_type_arguments.Length() == 1));
-  const Class& array_class = Class::Handle(
+  const Class& array_class = Class::Handle(isolate(),
       isolate()->object_store()->array_class());
-  Type& type = Type::ZoneHandle(
+  Type& type = Type::ZoneHandle(I,
       Type::New(array_class, list_type_arguments, type_pos));
   type ^= ClassFinalizer::FinalizeType(
       current_class(), type, ClassFinalizer::kCanonicalize);
@@ -9579,10 +9657,10 @@
       if (FLAG_enable_type_checks &&
           !is_const &&
           !element_type.IsDynamicType()) {
-        element = new AssignableNode(element_pos,
-                                     element,
-                                     element_type,
-                                     Symbols::ListLiteralElement());
+        element = new(isolate()) AssignableNode(element_pos,
+                                                element,
+                                                element_type,
+                                                Symbols::ListLiteralElement());
       }
       element_list.Add(element);
       if (CurrentToken() == Token::kCOMMA) {
@@ -9598,10 +9676,10 @@
   if (is_const) {
     // Allocate and initialize the const list at compile time.
     Array& const_list =
-        Array::ZoneHandle(Array::New(element_list.length(), Heap::kOld));
+        Array::ZoneHandle(I, Array::New(element_list.length(), Heap::kOld));
     const_list.SetTypeArguments(
-        TypeArguments::Handle(list_type_arguments.Canonicalize()));
-    Error& malformed_error = Error::Handle();
+        TypeArguments::Handle(isolate(), list_type_arguments.Canonicalize()));
+    Error& malformed_error = Error::Handle(isolate());
     for (int i = 0; i < element_list.length(); i++) {
       AstNode* elem = element_list[i];
       // Arguments have been evaluated to a literal value already.
@@ -9611,7 +9689,9 @@
           !element_type.IsDynamicType() &&
           (!elem->AsLiteralNode()->literal().IsNull() &&
            !elem->AsLiteralNode()->literal().IsInstanceOf(
-               element_type, TypeArguments::Handle(), &malformed_error))) {
+               element_type,
+               TypeArguments::Handle(isolate()),
+               &malformed_error))) {
         // If the failure is due to a malformed type error, display it instead.
         if (!malformed_error.IsNull()) {
           ErrorMsg(malformed_error);
@@ -9620,20 +9700,21 @@
                    "list literal element at index %d must be "
                    "a constant of type '%s'",
                    i,
-                   String::Handle(element_type.UserVisibleName()).ToCString());
+                   String::Handle(isolate(),
+                       element_type.UserVisibleName()).ToCString());
         }
       }
       const_list.SetAt(i, elem->AsLiteralNode()->literal());
     }
     const_list ^= TryCanonicalize(const_list, literal_pos);
     const_list.MakeImmutable();
-    return new LiteralNode(literal_pos, const_list);
+    return new(isolate()) LiteralNode(literal_pos, const_list);
   } else {
     // Factory call at runtime.
     const Class& factory_class =
-        Class::Handle(Library::LookupCoreClass(Symbols::List()));
+        Class::Handle(isolate(), Library::LookupCoreClass(Symbols::List()));
     ASSERT(!factory_class.IsNull());
-    const Function& factory_method = Function::ZoneHandle(
+    const Function& factory_method = Function::ZoneHandle(I,
         factory_class.LookupFactory(
             Library::PrivateCoreLibName(Symbols::ListLiteralFactory())));
     ASSERT(!factory_method.IsNull());
@@ -9644,12 +9725,12 @@
       CaptureInstantiator();
     }
     TypeArguments& factory_type_args =
-        TypeArguments::ZoneHandle(list_type_arguments.raw());
+        TypeArguments::ZoneHandle(I, list_type_arguments.raw());
     // If the factory class extends other parameterized classes, adjust the
     // type argument vector.
     if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 1)) {
       ASSERT(factory_type_args.Length() == 1);
-      Type& factory_type = Type::Handle(Type::New(
+      Type& factory_type = Type::Handle(isolate(), Type::New(
           factory_class, factory_type_args, type_pos, Heap::kNew));
       factory_type ^= ClassFinalizer::FinalizeType(
           current_class(), factory_type, ClassFinalizer::kFinalize);
@@ -9657,15 +9738,17 @@
       ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
     }
     factory_type_args = factory_type_args.Canonicalize();
-    ArgumentListNode* factory_param = new ArgumentListNode(literal_pos);
+    ArgumentListNode* factory_param = new(isolate()) ArgumentListNode(
+        literal_pos);
     if (element_list.length() == 0) {
       // TODO(srdjan): Use Object::empty_array once issue 9871 has been fixed.
-      Array& empty_array = Array::ZoneHandle(Object::empty_array().raw());
+      Array& empty_array = Array::ZoneHandle(I, Object::empty_array().raw());
       LiteralNode* empty_array_literal =
-          new LiteralNode(TokenPos(), empty_array);
+          new(isolate()) LiteralNode(TokenPos(), empty_array);
       factory_param->Add(empty_array_literal);
     } else {
-      ArrayNode* list = new ArrayNode(TokenPos(), type, element_list);
+      ArrayNode* list = new(isolate()) ArrayNode(
+          TokenPos(), type, element_list);
       factory_param->Add(list);
     }
     return CreateConstructorCallNode(literal_pos,
@@ -9684,10 +9767,8 @@
   if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) {
     EnsureExpressionTemp();
   }
-  return new ConstructorCallNode(token_pos,
-                                 type_arguments,
-                                 constructor,
-                                 arguments);
+  return new(isolate()) ConstructorCallNode(
+      token_pos, type_arguments, constructor, arguments);
 }
 
 
@@ -9725,10 +9806,10 @@
   const intptr_t literal_pos = TokenPos();
   ConsumeToken();
 
-  AbstractType& key_type = Type::ZoneHandle(Type::DynamicType());
-  AbstractType& value_type = Type::ZoneHandle(Type::DynamicType());
+  AbstractType& key_type = Type::ZoneHandle(I, Type::DynamicType());
+  AbstractType& value_type = Type::ZoneHandle(I, Type::DynamicType());
   TypeArguments& map_type_arguments =
-      TypeArguments::ZoneHandle(type_arguments.raw());
+      TypeArguments::ZoneHandle(I, type_arguments.raw());
   // If no type argument vector is provided, leave it as null, which is
   // equivalent to using dynamic as the type argument for the both key and value
   // types.
@@ -9772,10 +9853,8 @@
     if (FLAG_enable_type_checks &&
         !is_const &&
         !key_type.IsDynamicType()) {
-      key = new AssignableNode(key_pos,
-                               key,
-                               key_type,
-                               Symbols::ListLiteralElement());
+      key = new(isolate()) AssignableNode(
+          key_pos, key, key_type, Symbols::ListLiteralElement());
     }
     if (is_const) {
       ASSERT(key->IsLiteralNode());
@@ -9796,10 +9875,8 @@
     if (FLAG_enable_type_checks &&
         !is_const &&
         !value_type.IsDynamicType()) {
-      value = new AssignableNode(value_pos,
-                                 value,
-                                 value_type,
-                                 Symbols::ListLiteralElement());
+      value = new(isolate()) AssignableNode(
+          value_pos, value, value_type, Symbols::ListLiteralElement());
     }
     AddKeyValuePair(&kv_pairs_list, is_const, key, value);
 
@@ -9819,9 +9896,9 @@
 
     // First, create the canonicalized key-value pair array.
     Array& key_value_array =
-        Array::ZoneHandle(Array::New(kv_pairs_list.length(), Heap::kOld));
-    AbstractType& arg_type = Type::Handle();
-    Error& malformed_error = Error::Handle();
+        Array::ZoneHandle(I, Array::New(kv_pairs_list.length(), Heap::kOld));
+    AbstractType& arg_type = Type::Handle(isolate());
+    Error& malformed_error = Error::Handle(isolate());
     for (int i = 0; i < kv_pairs_list.length(); i++) {
       AstNode* arg = kv_pairs_list[i];
       // Arguments have been evaluated to a literal value already.
@@ -9850,7 +9927,8 @@
                      "a constant of type '%s'",
                      ((i % 2) == 0) ? "key" : "value",
                      i >> 1,
-                     String::Handle(arg_type.UserVisibleName()).ToCString());
+                     String::Handle(isolate(),
+                                    arg_type.UserVisibleName()).ToCString());
           }
         }
       }
@@ -9860,19 +9938,19 @@
     key_value_array.MakeImmutable();
 
     // Construct the map object.
-    const Class& immutable_map_class =
-        Class::Handle(Library::LookupCoreClass(Symbols::ImmutableMap()));
+    const Class& immutable_map_class = Class::Handle(isolate(),
+        Library::LookupCoreClass(Symbols::ImmutableMap()));
     ASSERT(!immutable_map_class.IsNull());
     // If the immutable map class extends other parameterized classes, we need
     // to adjust the type argument vector. This is currently not the case.
     ASSERT(immutable_map_class.NumTypeArguments() == 2);
-    ArgumentListNode* constr_args = new ArgumentListNode(TokenPos());
-    constr_args->Add(new LiteralNode(literal_pos, key_value_array));
+    ArgumentListNode* constr_args = new(isolate()) ArgumentListNode(TokenPos());
+    constr_args->Add(new(isolate()) LiteralNode(literal_pos, key_value_array));
     const Function& map_constr =
-        Function::ZoneHandle(immutable_map_class.LookupConstructor(
+        Function::ZoneHandle(I, immutable_map_class.LookupConstructor(
             Library::PrivateCoreLibName(Symbols::ImmutableMapConstructor())));
     ASSERT(!map_constr.IsNull());
-    const Object& constructor_result = Object::Handle(
+    const Object& constructor_result = Object::Handle(isolate(),
         EvaluateConstConstructorCall(immutable_map_class,
                                      map_type_arguments,
                                      map_constr,
@@ -9883,15 +9961,15 @@
                      "error executing const Map constructor");
     } else {
       const Instance& const_instance = Instance::Cast(constructor_result);
-      return new LiteralNode(literal_pos,
-                             Instance::ZoneHandle(const_instance.raw()));
+      return new(isolate()) LiteralNode(
+          literal_pos, Instance::ZoneHandle(I, const_instance.raw()));
     }
   } else {
     // Factory call at runtime.
     const Class& factory_class =
-        Class::Handle(Library::LookupCoreClass(Symbols::Map()));
+        Class::Handle(isolate(), Library::LookupCoreClass(Symbols::Map()));
     ASSERT(!factory_class.IsNull());
-    const Function& factory_method = Function::ZoneHandle(
+    const Function& factory_method = Function::ZoneHandle(I,
         factory_class.LookupFactory(
             Library::PrivateCoreLibName(Symbols::MapLiteralFactory())));
     ASSERT(!factory_method.IsNull());
@@ -9902,12 +9980,12 @@
       CaptureInstantiator();
     }
     TypeArguments& factory_type_args =
-        TypeArguments::ZoneHandle(map_type_arguments.raw());
+        TypeArguments::ZoneHandle(I, map_type_arguments.raw());
     // If the factory class extends other parameterized classes, adjust the
     // type argument vector.
     if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 2)) {
       ASSERT(factory_type_args.Length() == 2);
-      Type& factory_type = Type::Handle(Type::New(
+      Type& factory_type = Type::Handle(isolate(), Type::New(
           factory_class, factory_type_args, type_pos, Heap::kNew));
       factory_type ^= ClassFinalizer::FinalizeType(
           current_class(), factory_type, ClassFinalizer::kFinalize);
@@ -9915,12 +9993,13 @@
       ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
     }
     factory_type_args = factory_type_args.Canonicalize();
-    ArgumentListNode* factory_param = new ArgumentListNode(literal_pos);
+    ArgumentListNode* factory_param =
+        new(isolate()) ArgumentListNode(literal_pos);
     // The kv_pair array is temporary and of element type dynamic. It is passed
     // to the factory to initialize a properly typed map.
-    ArrayNode* kv_pairs = new ArrayNode(
+    ArrayNode* kv_pairs = new(isolate()) ArrayNode(
         TokenPos(),
-        Type::ZoneHandle(Type::ArrayType()),
+        Type::ZoneHandle(I, Type::ArrayType()),
         kv_pairs_list);
     factory_param->Add(kv_pairs);
     return CreateConstructorCallNode(literal_pos,
@@ -9941,7 +10020,7 @@
     ConsumeToken();
   }
   const intptr_t type_pos = TokenPos();
-  TypeArguments& type_arguments = TypeArguments::Handle(
+  TypeArguments& type_arguments = TypeArguments::Handle(isolate(),
       ParseTypeArguments(ClassFinalizer::kCanonicalize));
   // Malformed type arguments are mapped to dynamic, so we will not encounter
   // them here.
@@ -9964,7 +10043,7 @@
   ASSERT(CurrentToken() == Token::kHASH);
   ConsumeToken();
   intptr_t symbol_pos = TokenPos();
-  String& symbol = String::Handle();
+  String& symbol = String::Handle(isolate());
   if (IsIdentifier()) {
     symbol = CurrentLiteral()->raw();
     ConsumeToken();
@@ -9982,18 +10061,19 @@
   }
   // Lookup class Symbol from internal library and call the
   // constructor to create a symbol instance.
-  const Library& lib = Library::Handle(Library::InternalLibrary());
-  const Class& symbol_class = Class::Handle(lib.LookupClass(Symbols::Symbol()));
+  const Library& lib = Library::Handle(isolate(), Library::InternalLibrary());
+  const Class& symbol_class = Class::Handle(isolate(),
+                                            lib.LookupClass(Symbols::Symbol()));
   ASSERT(!symbol_class.IsNull());
-  ArgumentListNode* constr_args = new ArgumentListNode(symbol_pos);
-  constr_args->Add(new LiteralNode(
-      symbol_pos, String::ZoneHandle(Symbols::New(symbol))));
-  const Function& constr = Function::ZoneHandle(
+  ArgumentListNode* constr_args = new(isolate()) ArgumentListNode(symbol_pos);
+  constr_args->Add(new(isolate()) LiteralNode(
+      symbol_pos, String::ZoneHandle(I, Symbols::New(symbol))));
+  const Function& constr = Function::ZoneHandle(I,
       symbol_class.LookupConstructor(Symbols::SymbolCtor()));
   ASSERT(!constr.IsNull());
-  const Object& result = Object::Handle(
+  const Object& result = Object::Handle(isolate(),
       EvaluateConstConstructorCall(symbol_class,
-                                   TypeArguments::Handle(),
+                                   TypeArguments::Handle(isolate()),
                                    constr,
                                    constr_args));
   if (result.IsUnhandledException()) {
@@ -10002,7 +10082,8 @@
                    "error executing const Symbol constructor");
   }
   const Instance& instance = Instance::Cast(result);
-  return new LiteralNode(symbol_pos, Instance::ZoneHandle(instance.raw()));
+  return new(isolate()) LiteralNode(symbol_pos,
+                                    Instance::ZoneHandle(I, instance.raw()));
 }
 
 
@@ -10032,20 +10113,21 @@
   intptr_t type_pos = TokenPos();
   // Can't allocate const objects of a deferred type.
   const bool allow_deferred_type = !is_const;
-  AbstractType& type = AbstractType::Handle(
+  AbstractType& type = AbstractType::Handle(isolate(),
       ParseType(ClassFinalizer::kCanonicalizeWellFormed, allow_deferred_type));
   // In case the type is malformed, throw a dynamic type error after finishing
   // parsing the instance creation expression.
   if (!type.IsMalformed() && (type.IsTypeParameter() || type.IsDynamicType())) {
     // Replace the type with a malformed type.
     type = ClassFinalizer::NewFinalizedMalformedType(
-        Error::Handle(),  // No previous error.
+        Error::Handle(isolate()),  // No previous error.
         script_,
         type_pos,
         "%s'%s' cannot be instantiated",
         type.IsTypeParameter() ? "type parameter " : "",
         type.IsTypeParameter() ?
-            String::Handle(type.UserVisibleName()).ToCString() : "dynamic");
+            String::Handle(isolate(), type.UserVisibleName()).ToCString() :
+            "dynamic");
   }
 
   // The grammar allows for an optional ('.' identifier)? after the type, which
@@ -10067,17 +10149,17 @@
   // malbounded type or report a compile-time error if the constructor is const.
   if (type.IsMalformedOrMalbounded()) {
     if (is_const) {
-      const Error& error = Error::Handle(type.error());
+      const Error& error = Error::Handle(isolate(), type.error());
       ErrorMsg(error);
     }
     return ThrowTypeError(type_pos, type);
   }
 
   // Resolve the type and optional identifier to a constructor or factory.
-  Class& type_class = Class::Handle(type.type_class());
-  String& type_class_name = String::Handle(type_class.Name());
+  Class& type_class = Class::Handle(isolate(), type.type_class());
+  String& type_class_name = String::Handle(isolate(), type_class.Name());
   TypeArguments& type_arguments =
-      TypeArguments::ZoneHandle(type.arguments());
+      TypeArguments::ZoneHandle(I, type.arguments());
 
   // A constructor has an implicit 'this' parameter (instance to construct)
   // and a factory has an implicit 'this' parameter (type_arguments).
@@ -10086,12 +10168,12 @@
 
   // An additional type check of the result of a redirecting factory may be
   // required.
-  AbstractType& type_bound = AbstractType::ZoneHandle();
+  AbstractType& type_bound = AbstractType::ZoneHandle(I);
 
   // Make sure that an appropriate constructor exists.
   String& constructor_name =
       BuildConstructorName(type_class_name, named_constructor);
-  Function& constructor = Function::ZoneHandle(
+  Function& constructor = Function::ZoneHandle(I,
       type_class.LookupConstructor(constructor_name));
   if (constructor.IsNull()) {
     constructor = type_class.LookupFactory(constructor_name);
@@ -10102,13 +10184,13 @@
       // compile-time error if the constructor is const.
       if (is_const) {
         type = ClassFinalizer::NewFinalizedMalformedType(
-            Error::Handle(),  // No previous error.
+            Error::Handle(isolate()),  // No previous error.
             script_,
             call_pos,
             "class '%s' has no constructor or factory named '%s'",
-            String::Handle(type_class.Name()).ToCString(),
+            String::Handle(isolate(), type_class.Name()).ToCString(),
             external_constructor_name.ToCString());
-        ErrorMsg(Error::Handle(type.error()));
+        ErrorMsg(Error::Handle(isolate(), type.error()));
       }
       return ThrowNoSuchMethodError(call_pos,
                                     type_class,
@@ -10116,15 +10198,16 @@
                                     arguments,
                                     InvocationMirror::kConstructor,
                                     InvocationMirror::kMethod,
-                                    &constructor);
+                                    NULL);  // No existing function.
     } else if (constructor.IsRedirectingFactory()) {
       ClassFinalizer::ResolveRedirectingFactory(type_class, constructor);
-      Type& redirect_type = Type::Handle(constructor.RedirectionType());
+      Type& redirect_type = Type::Handle(isolate(),
+                                         constructor.RedirectionType());
       if (!redirect_type.IsMalformedOrMalbounded() &&
           !redirect_type.IsInstantiated()) {
         // The type arguments of the redirection type are instantiated from the
         // type arguments of the parsed type of the 'new' or 'const' expression.
-        Error& error = Error::Handle();
+        Error& error = Error::Handle(isolate());
         redirect_type ^= redirect_type.InstantiateFrom(type_arguments, &error);
         if (!error.IsNull()) {
           redirect_type = ClassFinalizer::NewFinalizedMalformedType(
@@ -10132,12 +10215,13 @@
               script_,
               call_pos,
               "redirecting factory type '%s' cannot be instantiated",
-              String::Handle(redirect_type.UserVisibleName()).ToCString());
+              String::Handle(isolate(),
+                             redirect_type.UserVisibleName()).ToCString());
         }
       }
       if (redirect_type.IsMalformedOrMalbounded()) {
         if (is_const) {
-          ErrorMsg(Error::Handle(redirect_type.error()));
+          ErrorMsg(Error::Handle(isolate(), redirect_type.error()));
         }
         return ThrowTypeError(redirect_type.token_pos(), redirect_type);
       }
@@ -10164,22 +10248,23 @@
   ASSERT(!constructor.IsNull());
   if (type_class.is_abstract() && !constructor.IsFactory()) {
     // Evaluate arguments before throwing.
-    LetNode* result = new LetNode(call_pos);
+    LetNode* result = new(isolate()) LetNode(call_pos);
     for (intptr_t i = 0; i < arguments->length(); ++i) {
       result->AddNode(arguments->NodeAt(i));
     }
-    ArgumentListNode* error_arguments = new ArgumentListNode(type_pos);
-    error_arguments->Add(new LiteralNode(
-        TokenPos(), Integer::ZoneHandle(Integer::New(type_pos))));
-    error_arguments->Add(new LiteralNode(
-        TokenPos(), String::ZoneHandle(type_class_name.raw())));
+    ArgumentListNode* error_arguments =
+        new(isolate()) ArgumentListNode(type_pos);
+    error_arguments->Add(new(isolate()) LiteralNode(
+        TokenPos(), Integer::ZoneHandle(I, Integer::New(type_pos))));
+    error_arguments->Add(new(isolate()) LiteralNode(
+        TokenPos(), String::ZoneHandle(I, type_class_name.raw())));
     result->AddNode(
         MakeStaticCall(Symbols::AbstractClassInstantiationError(),
                        Library::PrivateCoreLibName(Symbols::ThrowNew()),
                        error_arguments));
     return result;
   }
-  String& error_message = String::Handle();
+  String& error_message = String::Handle(isolate());
   if (!constructor.AreValidArguments(arguments_length,
                                      arguments->names(),
                                      &error_message)) {
@@ -10190,7 +10275,7 @@
                "invalid arguments passed to constructor '%s' "
                "for class '%s': %s",
                external_constructor_name.ToCString(),
-               String::Handle(type_class.Name()).ToCString(),
+               String::Handle(isolate(), type_class.Name()).ToCString(),
                error_message.ToCString());
     }
     return ThrowNoSuchMethodError(call_pos,
@@ -10206,7 +10291,7 @@
   // compile-time error if the constructor is const.
   if (type.IsMalformedOrMalbounded()) {
     if (is_const) {
-      ErrorMsg(Error::Handle(type.error()));
+      ErrorMsg(Error::Handle(isolate(), type.error()));
     }
     return ThrowTypeError(type_pos, type);
   }
@@ -10221,7 +10306,7 @@
                "const object creation",
                external_constructor_name.ToCString());
     }
-    const Object& constructor_result = Object::Handle(
+    const Object& constructor_result = Object::Handle(isolate(),
         EvaluateConstConstructorCall(type_class,
                                      type_arguments,
                                      constructor,
@@ -10235,23 +10320,24 @@
     } else {
       // Const constructors can return null in the case where a const native
       // factory returns a null value. Thus we cannot use a Instance::Cast here.
-      Instance& const_instance = Instance::Handle();
+      Instance& const_instance = Instance::Handle(isolate());
       const_instance ^= constructor_result.raw();
-      new_object = new LiteralNode(new_pos,
-                                   Instance::ZoneHandle(const_instance.raw()));
+      new_object = new(isolate()) LiteralNode(
+          new_pos, Instance::ZoneHandle(I, const_instance.raw()));
       if (!type_bound.IsNull()) {
         ASSERT(!type_bound.IsMalformed());
-        Error& malformed_error = Error::Handle();
+        Error& malformed_error = Error::Handle(isolate());
         ASSERT(!is_top_level_);  // We cannot check unresolved types.
         if (!const_instance.IsInstanceOf(type_bound,
-                                         TypeArguments::Handle(),
+                                         TypeArguments::Handle(isolate()),
                                          &malformed_error)) {
           type_bound = ClassFinalizer::NewFinalizedMalformedType(
               malformed_error,
               script_,
               new_pos,
               "const factory result is not an instance of '%s'",
-              String::Handle(type_bound.UserVisibleName()).ToCString());
+              String::Handle(isolate(),
+                             type_bound.UserVisibleName()).ToCString());
           new_object = ThrowTypeError(new_pos, type_bound);
         }
         type_bound = AbstractType::null();
@@ -10271,10 +10357,8 @@
         new_pos, type_arguments, constructor, arguments);
   }
   if (!type_bound.IsNull()) {
-    new_object = new AssignableNode(new_pos,
-                                    new_object,
-                                    type_bound,
-                                    Symbols::FactoryResult());
+    new_object = new(isolate()) AssignableNode(
+         new_pos, new_object, type_bound, Symbols::FactoryResult());
   }
   return new_object;
 }
@@ -10309,7 +10393,7 @@
   if (result.IsUnhandledException()) {
     ErrorMsg("%s", Error::Cast(result).ToErrorCString());
   }
-  String& concatenated = String::ZoneHandle(isolate());
+  String& concatenated = String::ZoneHandle(I);
   concatenated ^= result.raw();
   concatenated = Symbols::New(concatenated);
   return concatenated;
@@ -10332,7 +10416,7 @@
       (l1_token != Token::kINTERPOL_VAR) &&
       (l1_token != Token::kINTERPOL_START)) {
     // Common case: no interpolation.
-    primary = new LiteralNode(literal_start, *CurrentLiteral());
+    primary = new(isolate()) LiteralNode(literal_start, *CurrentLiteral());
     ConsumeToken();
     return primary;
   }
@@ -10344,7 +10428,8 @@
     if (CurrentLiteral()->Length() > 0) {
       // Only add non-empty string sections to the values list
       // that will be concatenated.
-      values_list.Add(new LiteralNode(TokenPos(), *CurrentLiteral()));
+      values_list.Add(new(isolate()) LiteralNode(TokenPos(),
+                                                 *CurrentLiteral()));
     }
     ConsumeToken();
     while ((CurrentToken() == Token::kINTERPOL_VAR) ||
@@ -10378,7 +10463,8 @@
             const_expr->IsBool() ||
             const_expr->IsNull())) {
           // Change expr into a literal.
-          expr = new LiteralNode(expr_pos, EvaluateConstExpr(expr_pos, expr));
+          expr = new(isolate()) LiteralNode(expr_pos,
+                                            EvaluateConstExpr(expr_pos, expr));
         } else {
           is_compiletime_const = false;
         }
@@ -10388,24 +10474,27 @@
   }
   if (is_compiletime_const) {
     if (has_interpolation) {
-      primary = new LiteralNode(literal_start, Interpolate(values_list));
+      primary = new(isolate()) LiteralNode(
+          literal_start, Interpolate(values_list));
     } else {
-      const Array& strings = Array::Handle(Array::New(values_list.length()));
+      const Array& strings = Array::Handle(isolate(),
+                                           Array::New(values_list.length()));
       for (int i = 0; i < values_list.length(); i++) {
         const Instance& part = values_list[i]->AsLiteralNode()->literal();
         ASSERT(part.IsString());
         strings.SetAt(i, String::Cast(part));
       }
-      String& lit = String::ZoneHandle(String::ConcatAll(strings, Heap::kOld));
+      String& lit = String::ZoneHandle(I,
+                                       String::ConcatAll(strings, Heap::kOld));
       lit = Symbols::New(lit);
-      primary = new LiteralNode(literal_start, lit);
+      primary = new(isolate()) LiteralNode(literal_start, lit);
     }
   } else {
-    ArrayNode* values = new ArrayNode(
+    ArrayNode* values = new(isolate()) ArrayNode(
         TokenPos(),
-        Type::ZoneHandle(Type::ArrayType()),
+        Type::ZoneHandle(I, Type::ArrayType()),
         values_list);
-    primary = new StringInterpolateNode(TokenPos(), values);
+    primary = new(isolate()) StringInterpolateNode(TokenPos(), values);
   }
   return primary;
 }
@@ -10415,6 +10504,7 @@
   TRACE_PARSER("ParsePrimary");
   ASSERT(!is_top_level_);
   AstNode* primary = NULL;
+  const Token::Kind token = CurrentToken();
   if (IsFunctionLiteral()) {
     // The name of a literal function is visible from inside the function, but
     // must not collide with names in the scope declaring the literal.
@@ -10431,10 +10521,10 @@
                                     &primary)) {
         // Check whether the identifier is a type parameter.
         if (!current_class().IsNull()) {
-          TypeParameter& type_param = TypeParameter::ZoneHandle(
+          TypeParameter& type_param = TypeParameter::ZoneHandle(I,
               current_class().LookupTypeParameter(*(qual_ident.ident)));
           if (!type_param.IsNull()) {
-            return new PrimaryNode(qual_ident.ident_pos, type_param);
+            return new(isolate()) PrimaryNode(qual_ident.ident_pos, type_param);
           }
         }
         // This is a non-local unqualified identifier so resolve the
@@ -10462,7 +10552,8 @@
           // let ParseSelectors() handle the loadLibrary call.
           SetPosition(qual_ident_pos);
           ConsumeToken();  // Prefix name.
-          primary = new LiteralNode(qual_ident_pos, *qual_ident.lib_prefix);
+          primary = new(isolate()) LiteralNode(
+              qual_ident_pos, *qual_ident.lib_prefix);
         } else {
           // TODO(hausner): Ideally we should generate the NoSuchMethodError
           // later, when we know more about how the unresolved name is used.
@@ -10475,7 +10566,7 @@
           // to determine whether we have an unresolved method call or
           // field access.
           String& qualified_name =
-              String::ZoneHandle(qual_ident.lib_prefix->name());
+              String::ZoneHandle(I, qual_ident.lib_prefix->name());
           qualified_name = String::Concat(qualified_name, Symbols::Dot());
           qualified_name = String::Concat(qualified_name, *qual_ident.ident);
           qualified_name = Symbols::New(qualified_name);
@@ -10493,45 +10584,45 @@
       }
     }
     ASSERT(primary != NULL);
-  } else if (CurrentToken() == Token::kTHIS) {
+  } else if (token == Token::kTHIS) {
     LocalVariable* local = LookupLocalScope(Symbols::This());
     if (local == NULL) {
       ErrorMsg("receiver 'this' is not in scope");
     }
-    primary = new LoadLocalNode(TokenPos(), local);
+    primary = new(isolate()) LoadLocalNode(TokenPos(), local);
     ConsumeToken();
-  } else if (CurrentToken() == Token::kINTEGER) {
-    const Integer& literal = Integer::ZoneHandle(CurrentIntegerLiteral());
-    primary = new LiteralNode(TokenPos(), literal);
+  } else if (token == Token::kINTEGER) {
+    const Integer& literal = Integer::ZoneHandle(I, CurrentIntegerLiteral());
+    primary = new(isolate()) LiteralNode(TokenPos(), literal);
     ConsumeToken();
-  } else if (CurrentToken() == Token::kTRUE) {
-    primary = new LiteralNode(TokenPos(), Bool::True());
+  } else if (token == Token::kTRUE) {
+    primary = new(isolate()) LiteralNode(TokenPos(), Bool::True());
     ConsumeToken();
-  } else if (CurrentToken() == Token::kFALSE) {
-    primary = new LiteralNode(TokenPos(), Bool::False());
+  } else if (token == Token::kFALSE) {
+    primary = new(isolate()) LiteralNode(TokenPos(), Bool::False());
     ConsumeToken();
-  } else if (CurrentToken() == Token::kNULL) {
-    primary = new LiteralNode(TokenPos(), Instance::ZoneHandle());
+  } else if (token == Token::kNULL) {
+    primary = new(isolate()) LiteralNode(TokenPos(), Instance::ZoneHandle(I));
     ConsumeToken();
-  } else if (CurrentToken() == Token::kLPAREN) {
+  } else if (token == Token::kLPAREN) {
     ConsumeToken();
     const bool saved_mode = SetAllowFunctionLiterals(true);
     primary = ParseExpr(kAllowConst, kConsumeCascades);
     SetAllowFunctionLiterals(saved_mode);
     ExpectToken(Token::kRPAREN);
-  } else if (CurrentToken() == Token::kDOUBLE) {
-    Double& double_value = Double::ZoneHandle(CurrentDoubleLiteral());
+  } else if (token == Token::kDOUBLE) {
+    Double& double_value = Double::ZoneHandle(I, CurrentDoubleLiteral());
     if (double_value.IsNull()) {
       ErrorMsg("invalid double literal");
     }
-    primary = new LiteralNode(TokenPos(), double_value);
+    primary = new(isolate()) LiteralNode(TokenPos(), double_value);
     ConsumeToken();
-  } else if (CurrentToken() == Token::kSTRING) {
+  } else if (token == Token::kSTRING) {
     primary = ParseStringLiteral(true);
-  } else if (CurrentToken() == Token::kNEW) {
+  } else if (token == Token::kNEW) {
     ConsumeToken();
     primary = ParseNewOperator(Token::kNEW);
-  } else if (CurrentToken() == Token::kCONST) {
+  } else if (token == Token::kCONST) {
     if ((LookaheadToken(1) == Token::kLT) ||
         (LookaheadToken(1) == Token::kLBRACK) ||
         (LookaheadToken(1) == Token::kINDEX) ||
@@ -10541,14 +10632,14 @@
       ConsumeToken();
       primary = ParseNewOperator(Token::kCONST);
     }
-  } else if (CurrentToken() == Token::kLT ||
-             CurrentToken() == Token::kLBRACK ||
-             CurrentToken() == Token::kINDEX ||
-             CurrentToken() == Token::kLBRACE) {
+  } else if (token == Token::kLT ||
+             token == Token::kLBRACK ||
+             token == Token::kINDEX ||
+             token == Token::kLBRACE) {
     primary = ParseCompoundLiteral();
-  } else if (CurrentToken() == Token::kHASH) {
+  } else if (token == Token::kHASH) {
     primary = ParseSymbolLiteral();
-  } else if (CurrentToken() == Token::kSUPER) {
+  } else if (token == Token::kSUPER) {
     if (parsing_metadata_) {
       ErrorMsg("cannot access superclass from metadata");
     }
@@ -10557,13 +10648,13 @@
     }
     if (current_class().SuperClass() == Class::null()) {
       ErrorMsg("class '%s' does not have a superclass",
-               String::Handle(current_class().Name()).ToCString());
+               String::Handle(isolate(), current_class().Name()).ToCString());
     }
     if (current_class().IsMixinApplication()) {
-      const Type& mixin_type = Type::Handle(current_class().mixin());
+      const Type& mixin_type = Type::Handle(isolate(), current_class().mixin());
       if (mixin_type.type_class() == current_function().origin()) {
         ErrorMsg("method of mixin class '%s' may not refer to 'super'",
-                 String::Handle(Class::Handle(
+                 String::Handle(isolate(), Class::Handle(isolate(),
                      current_function().origin()).Name()).ToCString());
       }
     }
@@ -10583,7 +10674,7 @@
         (CurrentToken() == Token::kNE)) {
       primary = ParseSuperOperator();
     } else {
-      primary = new PrimaryNode(super_pos, Symbols::Super());
+      primary = new(isolate()) PrimaryNode(super_pos, Symbols::Super());
     }
   } else {
     UnexpectedToken();
@@ -10607,24 +10698,25 @@
     ASSERT(field.is_const());
     ASSERT(field.value() != Object::sentinel().raw());
     ASSERT(field.value() != Object::transition_sentinel().raw());
-    return Instance::ZoneHandle(field.value());
+    return Instance::ZoneHandle(I, field.value());
   } else {
     ASSERT(expr->EvalConstExpr() != NULL);
-    ReturnNode* ret = new ReturnNode(expr->token_pos(), expr);
+    ReturnNode* ret = new(isolate()) ReturnNode(expr->token_pos(), expr);
     // Compile time constant expressions cannot reference anything from a
     // local scope.
-    LocalScope* empty_scope = new LocalScope(NULL, 0, 0);
-    SequenceNode* seq = new SequenceNode(expr->token_pos(), empty_scope);
+    LocalScope* empty_scope = new(isolate()) LocalScope(NULL, 0, 0);
+    SequenceNode* seq = new(isolate()) SequenceNode(expr->token_pos(),
+                                                    empty_scope);
     seq->Add(ret);
 
-    Object& result = Object::Handle(Compiler::ExecuteOnce(seq));
+    Object& result = Object::Handle(isolate(), Compiler::ExecuteOnce(seq));
     if (result.IsError()) {
       AppendErrorMsg(Error::Cast(result),
                      expr_pos,
                      "error evaluating constant expression");
     }
     ASSERT(result.IsInstance());
-    Instance& value = Instance::ZoneHandle();
+    Instance& value = Instance::ZoneHandle(I);
     value ^= result.raw();
     value = TryCanonicalize(value, TokenPos());
     return value;
@@ -10660,16 +10752,16 @@
 // previously parsed the function.
 void Parser::SkipFunctionPreamble() {
   while (true) {
-    if (CurrentToken() == Token::kLPAREN ||
-        CurrentToken() == Token::kARROW ||
-        CurrentToken() == Token::kSEMICOLON ||
-        CurrentToken() == Token::kLBRACE) {
+    const Token::Kind token = CurrentToken();
+    if (token == Token::kLPAREN ||
+        token == Token::kARROW ||
+        token == Token::kSEMICOLON ||
+        token == Token::kLBRACE) {
       return;
     }
     // Case handles "native" keyword, but also return types of form
     // native.SomeType where native is the name of a library.
-    if (CurrentToken() == Token::kIDENT &&
-        LookaheadToken(1) != Token::kPERIOD) {
+    if (token == Token::kIDENT && LookaheadToken(1) != Token::kPERIOD) {
       if (CurrentLiteral()->raw() == Symbols::Native().raw()) {
         return;
       }
@@ -10856,21 +10948,22 @@
 
 void Parser::SkipSelectors() {
   while (true) {
-    if (CurrentToken() == Token::kCASCADE) {
+    const Token::Kind current_token = CurrentToken();
+    if (current_token == Token::kCASCADE) {
       ConsumeToken();
       if (CurrentToken() == Token::kLBRACK) {
         continue;  // Consume [ in next loop iteration.
       } else {
         ExpectIdentifier("identifier or [ expected after ..");
       }
-    } else if (CurrentToken() == Token::kPERIOD) {
+    } else if (current_token == Token::kPERIOD) {
       ConsumeToken();
       ExpectIdentifier("identifier expected");
-    } else if (CurrentToken() == Token::kLBRACK) {
+    } else if (current_token == Token::kLBRACK) {
       ConsumeToken();
       SkipNestedExpr();
       ExpectToken(Token::kRBRACK);
-    } else if (CurrentToken() == Token::kLPAREN) {
+    } else if (current_token == Token::kLPAREN) {
       SkipActualParameters();
     } else {
       break;
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 8b94b40..64d83d7 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -38,12 +38,12 @@
 // The class ParsedFunction holds the result of parsing a function.
 class ParsedFunction : public ZoneAllocated {
  public:
-  explicit ParsedFunction(const Function& function)
+  ParsedFunction(Isolate* isolate, const Function& function)
       : function_(function),
-        code_(Code::Handle(function.unoptimized_code())),
+        code_(Code::Handle(isolate, function.unoptimized_code())),
         node_sequence_(NULL),
         instantiator_(NULL),
-        default_parameter_values_(Array::ZoneHandle()),
+        default_parameter_values_(Array::ZoneHandle(isolate, Array::null())),
         saved_current_context_var_(NULL),
         saved_entry_context_var_(NULL),
         expression_temp_var_(NULL),
@@ -51,12 +51,13 @@
         first_parameter_index_(0),
         first_stack_local_index_(0),
         num_copied_params_(0),
-        num_stack_locals_(0) {
+        num_stack_locals_(0),
+        isolate_(isolate) {
     ASSERT(function.IsZoneHandle());
   }
 
   const Function& function() const { return function_; }
-  RawCode* code() const { return code_.raw(); }
+  const Code& code() const { return code_; }
 
   SequenceNode* node_sequence() const { return node_sequence_; }
   void SetNodeSequence(SequenceNode* node_sequence);
@@ -120,6 +121,8 @@
 
   void AllocateVariables();
 
+  Isolate* isolate() const { return isolate_; }
+
  private:
   const Function& function_;
   Code& code_;
@@ -136,6 +139,8 @@
   int num_copied_params_;
   int num_stack_locals_;
 
+  Isolate* isolate_;
+
   DISALLOW_COPY_AND_ASSIGN(ParsedFunction);
 };
 
@@ -240,7 +245,17 @@
   }
 
   intptr_t TokenPos() const { return tokens_iterator_.CurrentPosition(); }
-  inline Token::Kind CurrentToken();
+
+  Token::Kind CurrentToken() {
+    if (token_kind_ == Token::kILLEGAL) {
+      ComputeCurrentToken();
+    }
+    CompilerStats::num_token_checks++;
+    return token_kind_;
+  }
+
+  void ComputeCurrentToken();
+
   Token::Kind LookaheadToken(int num_tokens);
   String* CurrentLiteral() const;
   RawDouble* CurrentDoubleLiteral() const;
@@ -637,7 +652,7 @@
                                   ArgumentListNode* function_arguments,
                                   InvocationMirror::Call call,
                                   InvocationMirror::Type type,
-                                  Function* func);
+                                  const Function* func);
 
   void CheckOperatorArity(const MemberDesc& member);
 
diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
index 499b8fd..0595c9b 100644
--- a/runtime/vm/parser_test.cc
+++ b/runtime/vm/parser_test.cc
@@ -30,7 +30,8 @@
   EXPECT(Isolate::Current() != NULL);
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
-    ParsedFunction* parsed_function = new ParsedFunction(function);
+    ParsedFunction* parsed_function =
+        new ParsedFunction(Isolate::Current(), function);
     Parser::ParseFunction(parsed_function);
     EXPECT(parsed_function->node_sequence() != NULL);
     printf("Class %s function %s:\n", cname, fname);
diff --git a/runtime/vm/port.cc b/runtime/vm/port.cc
index a055cee..eecfd33 100644
--- a/runtime/vm/port.cc
+++ b/runtime/vm/port.cc
@@ -254,7 +254,7 @@
   }
 
   MessageHandler* handler = map_[index].handler;
-  return handler->GetIsolate();
+  return handler->isolate();
 }
 
 
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 1c6e2cc..4cb4e10 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -151,6 +151,7 @@
     return;
   }
   ThreadInterrupter::Register(RecordSampleInterruptCallback, isolate);
+  ThreadInterrupter::WakeUp();
 }
 
 
@@ -1585,6 +1586,7 @@
   ASSERT(sample_buffer != NULL);
   sample_buffer_ = sample_buffer;
   own_sample_buffer_ = own_sample_buffer;
+  block_count_ = 0;
 }
 
 
@@ -1597,6 +1599,23 @@
 }
 
 
+void IsolateProfilerData::Block() {
+  block_count_++;
+}
+
+
+void IsolateProfilerData::Unblock() {
+  block_count_--;
+  if (block_count_ < 0) {
+    FATAL("Too many calls to Dart_IsolateUnblocked.");
+  }
+  if (!blocked()) {
+    // We just unblocked this isolate, wake up the thread interrupter.
+    ThreadInterrupter::WakeUp();
+  }
+}
+
+
 Sample* SampleBuffer::ReserveSample() {
   ASSERT(samples_ != NULL);
   uintptr_t cursor = AtomicOperations::FetchAndIncrement(&cursor_);
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 0602b27..f9742b3 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -75,9 +75,18 @@
     sample_buffer_ = sample_buffer;
   }
 
+  bool blocked() const {
+    return block_count_ > 0;
+  }
+
+  void Block();
+
+  void Unblock();
+
  private:
   SampleBuffer* sample_buffer_;
   bool own_sample_buffer_;
+  intptr_t block_count_;
 
   DISALLOW_COPY_AND_ASSIGN(IsolateProfilerData);
 };
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index ebd2727..abd9933 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1642,62 +1642,62 @@
 
 inline bool RawObject::IsErrorClassId(intptr_t index) {
   // Make sure this function is updated when new Error types are added.
-  ASSERT(kApiErrorCid == kErrorCid + 1 &&
-         kLanguageErrorCid == kErrorCid + 2 &&
-         kUnhandledExceptionCid == kErrorCid + 3 &&
-         kUnwindErrorCid == kErrorCid + 4 &&
-         kInstanceCid == kErrorCid + 5);
+  COMPILE_ASSERT(kApiErrorCid == kErrorCid + 1 &&
+                 kLanguageErrorCid == kErrorCid + 2 &&
+                 kUnhandledExceptionCid == kErrorCid + 3 &&
+                 kUnwindErrorCid == kErrorCid + 4 &&
+                 kInstanceCid == kErrorCid + 5);
   return (index >= kErrorCid && index < kInstanceCid);
 }
 
 
 inline bool RawObject::IsNumberClassId(intptr_t index) {
   // Make sure this function is updated when new Number types are added.
-  ASSERT(kIntegerCid == kNumberCid + 1 &&
-         kSmiCid == kNumberCid + 2 &&
-         kMintCid == kNumberCid + 3 &&
-         kBigintCid == kNumberCid + 4 &&
-         kDoubleCid == kNumberCid + 5);
+  COMPILE_ASSERT(kIntegerCid == kNumberCid + 1 &&
+                 kSmiCid == kNumberCid + 2 &&
+                 kMintCid == kNumberCid + 3 &&
+                 kBigintCid == kNumberCid + 4 &&
+                 kDoubleCid == kNumberCid + 5);
   return (index >= kNumberCid && index < kBoolCid);
 }
 
 
 inline bool RawObject::IsIntegerClassId(intptr_t index) {
   // Make sure this function is updated when new Integer types are added.
-  ASSERT(kSmiCid == kIntegerCid + 1 &&
-         kMintCid == kIntegerCid + 2 &&
-         kBigintCid == kIntegerCid + 3 &&
-         kDoubleCid == kIntegerCid + 4);
+  COMPILE_ASSERT(kSmiCid == kIntegerCid + 1 &&
+                 kMintCid == kIntegerCid + 2 &&
+                 kBigintCid == kIntegerCid + 3 &&
+                 kDoubleCid == kIntegerCid + 4);
   return (index >= kIntegerCid && index < kDoubleCid);
 }
 
 
 inline bool RawObject::IsStringClassId(intptr_t index) {
   // Make sure this function is updated when new StringCid types are added.
-  ASSERT(kOneByteStringCid == kStringCid + 1 &&
-         kTwoByteStringCid == kStringCid + 2 &&
-         kExternalOneByteStringCid == kStringCid + 3 &&
-         kExternalTwoByteStringCid == kStringCid + 4);
+  COMPILE_ASSERT(kOneByteStringCid == kStringCid + 1 &&
+                 kTwoByteStringCid == kStringCid + 2 &&
+                 kExternalOneByteStringCid == kStringCid + 3 &&
+                 kExternalTwoByteStringCid == kStringCid + 4);
   return (index >= kStringCid && index <= kExternalTwoByteStringCid);
 }
 
 
 inline bool RawObject::IsOneByteStringClassId(intptr_t index) {
   // Make sure this function is updated when new StringCid types are added.
-  ASSERT(kOneByteStringCid == kStringCid + 1 &&
-         kTwoByteStringCid == kStringCid + 2 &&
-         kExternalOneByteStringCid == kStringCid + 3 &&
-         kExternalTwoByteStringCid == kStringCid + 4);
+  COMPILE_ASSERT(kOneByteStringCid == kStringCid + 1 &&
+                 kTwoByteStringCid == kStringCid + 2 &&
+                 kExternalOneByteStringCid == kStringCid + 3 &&
+                 kExternalTwoByteStringCid == kStringCid + 4);
   return (index == kOneByteStringCid || index == kExternalOneByteStringCid);
 }
 
 
 inline bool RawObject::IsTwoByteStringClassId(intptr_t index) {
   // Make sure this function is updated when new StringCid types are added.
-  ASSERT(kOneByteStringCid == kStringCid + 1 &&
-         kTwoByteStringCid == kStringCid + 2 &&
-         kExternalOneByteStringCid == kStringCid + 3 &&
-         kExternalTwoByteStringCid == kStringCid + 4);
+  COMPILE_ASSERT(kOneByteStringCid == kStringCid + 1 &&
+                 kTwoByteStringCid == kStringCid + 2 &&
+                 kExternalOneByteStringCid == kStringCid + 3 &&
+                 kExternalTwoByteStringCid == kStringCid + 4);
   return (index == kOneByteStringCid ||
           index == kTwoByteStringCid ||
           index == kExternalOneByteStringCid ||
@@ -1707,10 +1707,10 @@
 
 inline bool RawObject::IsExternalStringClassId(intptr_t index) {
   // Make sure this function is updated when new StringCid types are added.
-  ASSERT(kOneByteStringCid == kStringCid + 1 &&
-         kTwoByteStringCid == kStringCid + 2 &&
-         kExternalOneByteStringCid == kStringCid + 3 &&
-         kExternalTwoByteStringCid == kStringCid + 4);
+  COMPILE_ASSERT(kOneByteStringCid == kStringCid + 1 &&
+                 kTwoByteStringCid == kStringCid + 2 &&
+                 kExternalOneByteStringCid == kStringCid + 3 &&
+                 kExternalTwoByteStringCid == kStringCid + 4);
   return (index == kExternalOneByteStringCid ||
           index == kExternalTwoByteStringCid);
 }
@@ -1718,7 +1718,7 @@
 
 inline bool RawObject::IsBuiltinListClassId(intptr_t index) {
   // Make sure this function is updated when new builtin List types are added.
-  ASSERT(kImmutableArrayCid == kArrayCid + 1);
+  COMPILE_ASSERT(kImmutableArrayCid == kArrayCid + 1);
   return ((index >= kArrayCid && index <= kImmutableArrayCid) ||
           (index == kGrowableObjectArrayCid) ||
           IsTypedDataClassId(index) ||
@@ -1729,20 +1729,20 @@
 
 inline bool RawObject::IsTypedDataClassId(intptr_t index) {
   // Make sure this is updated when new TypedData types are added.
-  ASSERT(kTypedDataUint8ArrayCid == kTypedDataInt8ArrayCid + 1 &&
-         kTypedDataUint8ClampedArrayCid == kTypedDataInt8ArrayCid + 2 &&
-         kTypedDataInt16ArrayCid == kTypedDataInt8ArrayCid + 3 &&
-         kTypedDataUint16ArrayCid == kTypedDataInt8ArrayCid + 4 &&
-         kTypedDataInt32ArrayCid == kTypedDataInt8ArrayCid + 5 &&
-         kTypedDataUint32ArrayCid == kTypedDataInt8ArrayCid + 6 &&
-         kTypedDataInt64ArrayCid == kTypedDataInt8ArrayCid + 7 &&
-         kTypedDataUint64ArrayCid == kTypedDataInt8ArrayCid + 8 &&
-         kTypedDataFloat32ArrayCid == kTypedDataInt8ArrayCid + 9 &&
-         kTypedDataFloat64ArrayCid == kTypedDataInt8ArrayCid + 10 &&
-         kTypedDataFloat32x4ArrayCid == kTypedDataInt8ArrayCid + 11 &&
-         kTypedDataInt32x4ArrayCid == kTypedDataInt8ArrayCid + 12 &&
-         kTypedDataFloat64x2ArrayCid == kTypedDataInt8ArrayCid + 13 &&
-         kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14);
+  COMPILE_ASSERT(kTypedDataUint8ArrayCid == kTypedDataInt8ArrayCid + 1 &&
+                 kTypedDataUint8ClampedArrayCid == kTypedDataInt8ArrayCid + 2 &&
+                 kTypedDataInt16ArrayCid == kTypedDataInt8ArrayCid + 3 &&
+                 kTypedDataUint16ArrayCid == kTypedDataInt8ArrayCid + 4 &&
+                 kTypedDataInt32ArrayCid == kTypedDataInt8ArrayCid + 5 &&
+                 kTypedDataUint32ArrayCid == kTypedDataInt8ArrayCid + 6 &&
+                 kTypedDataInt64ArrayCid == kTypedDataInt8ArrayCid + 7 &&
+                 kTypedDataUint64ArrayCid == kTypedDataInt8ArrayCid + 8 &&
+                 kTypedDataFloat32ArrayCid == kTypedDataInt8ArrayCid + 9 &&
+                 kTypedDataFloat64ArrayCid == kTypedDataInt8ArrayCid + 10 &&
+                 kTypedDataFloat32x4ArrayCid == kTypedDataInt8ArrayCid + 11 &&
+                 kTypedDataInt32x4ArrayCid == kTypedDataInt8ArrayCid + 12 &&
+                 kTypedDataFloat64x2ArrayCid == kTypedDataInt8ArrayCid + 13 &&
+                 kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14);
   return (index >= kTypedDataInt8ArrayCid &&
           index <= kTypedDataFloat64x2ArrayCid);
 }
@@ -1750,21 +1750,22 @@
 
 inline bool RawObject::IsTypedDataViewClassId(intptr_t index) {
   // Make sure this is updated when new TypedData types are added.
-  ASSERT(kTypedDataUint8ArrayViewCid == kTypedDataInt8ArrayViewCid + 1 &&
-         kTypedDataUint8ClampedArrayViewCid == kTypedDataInt8ArrayViewCid + 2 &&
-         kTypedDataInt16ArrayViewCid == kTypedDataInt8ArrayViewCid + 3 &&
-         kTypedDataUint16ArrayViewCid == kTypedDataInt8ArrayViewCid + 4 &&
-         kTypedDataInt32ArrayViewCid == kTypedDataInt8ArrayViewCid + 5 &&
-         kTypedDataUint32ArrayViewCid == kTypedDataInt8ArrayViewCid + 6 &&
-         kTypedDataInt64ArrayViewCid == kTypedDataInt8ArrayViewCid + 7 &&
-         kTypedDataUint64ArrayViewCid == kTypedDataInt8ArrayViewCid + 8 &&
-         kTypedDataFloat32ArrayViewCid == kTypedDataInt8ArrayViewCid + 9 &&
-         kTypedDataFloat64ArrayViewCid == kTypedDataInt8ArrayViewCid + 10 &&
-         kTypedDataFloat32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 11 &&
-         kTypedDataInt32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 12 &&
-         kTypedDataFloat64x2ArrayViewCid == kTypedDataInt8ArrayViewCid + 13 &&
-         kByteDataViewCid == kTypedDataInt8ArrayViewCid + 14 &&
-         kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 15);
+  COMPILE_ASSERT(
+      kTypedDataUint8ArrayViewCid == kTypedDataInt8ArrayViewCid + 1 &&
+      kTypedDataUint8ClampedArrayViewCid == kTypedDataInt8ArrayViewCid + 2 &&
+      kTypedDataInt16ArrayViewCid == kTypedDataInt8ArrayViewCid + 3 &&
+      kTypedDataUint16ArrayViewCid == kTypedDataInt8ArrayViewCid + 4 &&
+      kTypedDataInt32ArrayViewCid == kTypedDataInt8ArrayViewCid + 5 &&
+      kTypedDataUint32ArrayViewCid == kTypedDataInt8ArrayViewCid + 6 &&
+      kTypedDataInt64ArrayViewCid == kTypedDataInt8ArrayViewCid + 7 &&
+      kTypedDataUint64ArrayViewCid == kTypedDataInt8ArrayViewCid + 8 &&
+      kTypedDataFloat32ArrayViewCid == kTypedDataInt8ArrayViewCid + 9 &&
+      kTypedDataFloat64ArrayViewCid == kTypedDataInt8ArrayViewCid + 10 &&
+      kTypedDataFloat32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 11 &&
+      kTypedDataInt32x4ArrayViewCid == kTypedDataInt8ArrayViewCid + 12 &&
+      kTypedDataFloat64x2ArrayViewCid == kTypedDataInt8ArrayViewCid + 13 &&
+      kByteDataViewCid == kTypedDataInt8ArrayViewCid + 14 &&
+      kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 15);
   return (index >= kTypedDataInt8ArrayViewCid &&
           index <= kByteDataViewCid);
 }
@@ -1772,33 +1773,34 @@
 
 inline bool RawObject::IsExternalTypedDataClassId(intptr_t index) {
   // Make sure this is updated when new ExternalTypedData types are added.
-  ASSERT((kExternalTypedDataUint8ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 1) &&
-         (kExternalTypedDataUint8ClampedArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 2) &&
-         (kExternalTypedDataInt16ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 3) &&
-         (kExternalTypedDataUint16ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 4) &&
-         (kExternalTypedDataInt32ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 5) &&
-         (kExternalTypedDataUint32ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 6) &&
-         (kExternalTypedDataInt64ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 7) &&
-         (kExternalTypedDataUint64ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 8) &&
-         (kExternalTypedDataFloat32ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 9) &&
-         (kExternalTypedDataFloat64ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 10) &&
-         (kExternalTypedDataFloat32x4ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 11) &&
-         (kExternalTypedDataInt32x4ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 12) &&
-         (kExternalTypedDataFloat64x2ArrayCid ==
-          kExternalTypedDataInt8ArrayCid + 13) &&
-         (kNullCid == kExternalTypedDataInt8ArrayCid + 14));
+  COMPILE_ASSERT(
+      (kExternalTypedDataUint8ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 1) &&
+      (kExternalTypedDataUint8ClampedArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 2) &&
+      (kExternalTypedDataInt16ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 3) &&
+      (kExternalTypedDataUint16ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 4) &&
+      (kExternalTypedDataInt32ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 5) &&
+      (kExternalTypedDataUint32ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 6) &&
+      (kExternalTypedDataInt64ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 7) &&
+      (kExternalTypedDataUint64ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 8) &&
+      (kExternalTypedDataFloat32ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 9) &&
+      (kExternalTypedDataFloat64ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 10) &&
+      (kExternalTypedDataFloat32x4ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 11) &&
+      (kExternalTypedDataInt32x4ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 12) &&
+      (kExternalTypedDataFloat64x2ArrayCid ==
+       kExternalTypedDataInt8ArrayCid + 13) &&
+      (kNullCid == kExternalTypedDataInt8ArrayCid + 14));
   return (index >= kExternalTypedDataInt8ArrayCid &&
           index <= kExternalTypedDataFloat64x2ArrayCid);
 }
@@ -1835,9 +1837,10 @@
 
 inline intptr_t RawObject::NumberOfTypedDataClasses() {
   // Make sure this is updated when new TypedData types are added.
-  ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14);
-  ASSERT(kExternalTypedDataInt8ArrayCid == kTypedDataInt8ArrayViewCid + 15);
-  ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 14);
+  COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14);
+  COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid ==
+                 kTypedDataInt8ArrayViewCid + 15);
+  COMPILE_ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 14);
   return (kNullCid - kTypedDataInt8ArrayCid);
 }
 
diff --git a/runtime/vm/ring_buffer.h b/runtime/vm/ring_buffer.h
index 4849ee4..aa0115d 100644
--- a/runtime/vm/ring_buffer.h
+++ b/runtime/vm/ring_buffer.h
@@ -31,7 +31,7 @@
 
  private:
   static const int kMask = N - 1;
-  COMPILE_ASSERT((N & kMask) == 0, N_must_be_power_of_two);
+  COMPILE_ASSERT((N & kMask) == 0);
   T data_[N];
   int64_t count_;
 };
diff --git a/runtime/vm/runtime_entry_arm.cc b/runtime/vm/runtime_entry_arm.cc
index 3acf589..de52089 100644
--- a/runtime/vm/runtime_entry_arm.cc
+++ b/runtime/vm/runtime_entry_arm.cc
@@ -42,7 +42,7 @@
 #endif
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
-    ExternalLabel label(name(), entry);
+    ExternalLabel label(entry);
     __ BranchLink(&label);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 8beb911..01039c9 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -39,7 +39,7 @@
 #endif
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
-    ExternalLabel label(name(), entry);
+    ExternalLabel label(entry);
     __ BranchLink(&label, kNoPP);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
diff --git a/runtime/vm/runtime_entry_ia32.cc b/runtime/vm/runtime_entry_ia32.cc
index 942fad9..854afd0 100644
--- a/runtime/vm/runtime_entry_ia32.cc
+++ b/runtime/vm/runtime_entry_ia32.cc
@@ -26,7 +26,7 @@
 void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
-    ExternalLabel label(name(), GetEntryPoint());
+    ExternalLabel label(GetEntryPoint());
     __ call(&label);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
diff --git a/runtime/vm/runtime_entry_mips.cc b/runtime/vm/runtime_entry_mips.cc
index 320b7e9..ca4a529 100644
--- a/runtime/vm/runtime_entry_mips.cc
+++ b/runtime/vm/runtime_entry_mips.cc
@@ -42,7 +42,7 @@
 #endif
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
-    ExternalLabel label(name(), entry);
+    ExternalLabel label(entry);
     __ BranchLink(&label);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
diff --git a/runtime/vm/runtime_entry_x64.cc b/runtime/vm/runtime_entry_x64.cc
index 5683738..0e78100 100644
--- a/runtime/vm/runtime_entry_x64.cc
+++ b/runtime/vm/runtime_entry_x64.cc
@@ -23,7 +23,7 @@
 void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
-    ExternalLabel label(name(), GetEntryPoint());
+    ExternalLabel label(GetEntryPoint());
     __ call(&label);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index a19f02b..bd24d2a 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -162,7 +162,10 @@
   StackZone zone(isolate);
   HANDLESCOPE(isolate);
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, sp, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, message, arguments->NativeArgAt(1));
+  GET_NON_NULL_NATIVE_ARGUMENT(Array, message, arguments->NativeArgAt(1));
+
+  // Set the type of the OOB message.
+  message.SetAt(0, Smi::Handle(isolate, Smi::New(Message::kServiceOOBMsg)));
 
   // Serialize message.
   uint8_t* data = NULL;
@@ -619,24 +622,24 @@
 void Service::HandleIsolateMessage(Isolate* isolate, const Instance& msg) {
   ASSERT(isolate != NULL);
   ASSERT(!msg.IsNull());
-  ASSERT(msg.IsGrowableObjectArray());
+  ASSERT(msg.IsArray());
 
   {
     StackZone zone(isolate);
     HANDLESCOPE(isolate);
 
-    const GrowableObjectArray& message = GrowableObjectArray::Cast(msg);
-    // Message is a list with four entries.
-    ASSERT(message.Length() == 4);
+    const Array& message = Array::Cast(msg);
+    // Message is a list with five entries.
+    ASSERT(message.Length() == 5);
 
     Instance& reply_port = Instance::Handle(isolate);
     GrowableObjectArray& path = GrowableObjectArray::Handle(isolate);
-    GrowableObjectArray& option_keys = GrowableObjectArray::Handle(isolate);
-    GrowableObjectArray& option_values = GrowableObjectArray::Handle(isolate);
-    reply_port ^= message.At(0);
-    path ^= message.At(1);
-    option_keys ^= message.At(2);
-    option_values ^= message.At(3);
+    Array& option_keys = Array::Handle(isolate);
+    Array& option_values = Array::Handle(isolate);
+    reply_port ^= message.At(1);
+    path ^= message.At(2);
+    option_keys ^= message.At(3);
+    option_values ^= message.At(4);
 
     ASSERT(!path.IsNull());
     ASSERT(!option_keys.IsNull());
@@ -1833,25 +1836,25 @@
 void Service::HandleRootMessage(const Instance& msg) {
   Isolate* isolate = Isolate::Current();
   ASSERT(!msg.IsNull());
-  ASSERT(msg.IsGrowableObjectArray());
+  ASSERT(msg.IsArray());
 
   {
     StackZone zone(isolate);
     HANDLESCOPE(isolate);
 
-    const GrowableObjectArray& message = GrowableObjectArray::Cast(msg);
-    // Message is a list with four entries.
-    ASSERT(message.Length() == 4);
+    const Array& message = Array::Cast(msg);
+    // Message is a list with five entries.
+    ASSERT(message.Length() == 5);
 
     Instance& reply_port = Instance::Handle(isolate);
     GrowableObjectArray& path = GrowableObjectArray::Handle(isolate);
-    GrowableObjectArray& option_keys = GrowableObjectArray::Handle(isolate);
-    GrowableObjectArray& option_values = GrowableObjectArray::Handle(isolate);
+    Array& option_keys = Array::Handle(isolate);
+    Array& option_values = Array::Handle(isolate);
 
-    reply_port ^= message.At(0);
-    path ^= message.At(1);
-    option_keys ^= message.At(2);
-    option_values ^= message.At(3);
+    reply_port ^= message.At(1);
+    path ^= message.At(2);
+    option_keys ^= message.At(3);
+    option_values ^= message.At(4);
 
     ASSERT(!path.IsNull());
     ASSERT(!option_keys.IsNull());
@@ -1933,7 +1936,8 @@
   JSONObject jsobj(js);
   jsobj.AddProperty("type", "VM");
   jsobj.AddProperty("id", "vm");
-  jsobj.AddProperty("architecture", CPU::Id());
+  jsobj.AddProperty("targetCPU", CPU::Id());
+  jsobj.AddProperty("hostCPU", HostCPUFeatures::hardware());
   jsobj.AddProperty("version", Version::String());
   jsobj.AddProperty("assertsEnabled", FLAG_enable_asserts);
   jsobj.AddProperty("typeChecksEnabled", FLAG_enable_type_checks);
@@ -1953,9 +1957,47 @@
 }
 
 
+static bool HandleFlags(JSONStream* js) {
+  if (js->num_arguments() == 1) {
+    Flags::PrintJSON(js);
+    return true;
+  } else if (js->num_arguments() == 2) {
+    const char* arg = js->GetArgument(1);
+    if (strcmp(arg, "set") == 0) {
+      if (js->num_arguments() > 2) {
+        PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
+                   js->num_arguments());
+      } else {
+        if (js->HasOption("name") && js->HasOption("value")) {
+          JSONObject jsobj(js);
+          const char* flag_name = js->LookupOption("name");
+          const char* flag_value = js->LookupOption("value");
+          const char* error = NULL;
+          if (Flags::SetFlag(flag_name, flag_value, &error)) {
+            jsobj.AddProperty("type", "Success");
+            jsobj.AddProperty("id", "");
+          } else {
+            jsobj.AddProperty("type", "Failure");
+            jsobj.AddProperty("id", "");
+            jsobj.AddProperty("message", error);
+          }
+        } else {
+          PrintError(js, "expected to find 'name' and 'value' options");
+        }
+      }
+    }
+    return true;
+  } else {
+    PrintError(js, "Command too long");
+    return true;
+  }
+}
+
+
 static RootMessageHandlerEntry root_handlers[] = {
   { "_echo", HandleRootEcho },
   { "vm", HandleVM },
+  { "flags", HandleFlags },
 };
 
 
diff --git a/runtime/vm/service/message.dart b/runtime/vm/service/message.dart
index 908b56f..6a7c66b 100644
--- a/runtime/vm/service/message.dart
+++ b/runtime/vm/service/message.dart
@@ -60,9 +60,14 @@
         _completer.complete(value);
       }
     };
-    var keys = options.keys.toList();
-    var values = options.values.toList();
-    var request = [receivePort.sendPort, path, keys, values];
+    var keys = options.keys.toList(growable:false);
+    var values = options.values.toList(growable:false);
+    var request = new List(5)
+        ..[0] = 0  // Make room for OOB message type.
+        ..[1] = receivePort.sendPort
+        ..[2] = path
+        ..[3] = keys
+        ..[4] = values;
     sendIsolateServiceMessage(sendPort, request);
     return _completer.future;
   }
@@ -77,9 +82,14 @@
         _completer.complete(value);
       }
     };
-    var keys = options.keys.toList();
-    var values = options.values.toList();
-    var request = [receivePort.sendPort, path, keys, values];
+    var keys = options.keys.toList(growable:false);
+    var values = options.values.toList(growable:false);
+    var request = new List(5)
+        ..[0] = 0  // Make room for OOB message type.
+        ..[1] = receivePort.sendPort
+        ..[2] = path
+        ..[3] = keys
+        ..[4] = values;
     sendRootServiceMessage(request);
     return _completer.future;
   }
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index e4f8f06..ce00a84 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -18,6 +18,9 @@
 
 namespace dart {
 
+// This flag is used in the Service_Flags test below.
+DEFINE_FLAG(bool, service_testing_flag, false, "Comment");
+
 class ServiceTestMessageHandler : public MessageHandler {
  public:
   ServiceTestMessageHandler() : _msg(NULL) {}
@@ -87,11 +90,20 @@
 
 
 static RawInstance* Eval(Dart_Handle lib, const char* expr) {
-  Dart_Handle result = Dart_EvaluateExpr(lib, NewString(expr));
-  EXPECT_VALID(result);
+  Dart_Handle expr_val = Dart_EvaluateExpr(lib, NewString(expr));
+  EXPECT_VALID(expr_val);
   Isolate* isolate = Isolate::Current();
-  const Instance& instance = Api::UnwrapInstanceHandle(isolate, result);
-  return instance.raw();
+  const GrowableObjectArray& value =
+      Api::UnwrapGrowableObjectArrayHandle(isolate, expr_val);
+  const Array& result = Array::Handle(Array::MakeArray(value));
+  GrowableObjectArray& growable = GrowableObjectArray::Handle();
+  growable ^= result.At(3);
+  Array& array = Array::Handle(Array::MakeArray(growable));
+  result.SetAt(3, array);
+  growable ^= result.At(4);
+  array = Array::MakeArray(growable);
+  result.SetAt(4, array);
+  return result.raw();
 }
 
 
@@ -172,7 +184,7 @@
   Instance& service_msg = Instance::Handle();
 
   // Get the isolate summary.
-  service_msg = Eval(lib, "[port, [], [], []]");
+  service_msg = Eval(lib, "[0, port, [], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
 
@@ -227,7 +239,7 @@
   Instance& service_msg = Instance::Handle();
 
   // Get the stacktrace.
-  service_msg = Eval(lib, "[port, ['stacktrace'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['stacktrace'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
@@ -235,7 +247,7 @@
       handler.msg());
 
   // Malformed request.
-  service_msg = Eval(lib, "[port, ['stacktrace', 'jamboree'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['stacktrace', 'jamboree'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
@@ -271,7 +283,7 @@
   isolate->debugger()->SetBreakpointAtLine(url, 3);
 
   // Get the breakpoint list.
-  service_msg = Eval(lib, "[port, ['debug', 'breakpoints'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['debug', 'breakpoints'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
@@ -283,7 +295,7 @@
       handler.msg());
 
   // Individual breakpoint.
-  service_msg = Eval(lib, "[port, ['debug', 'breakpoints', '1'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['debug', 'breakpoints', '1'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
@@ -294,7 +306,7 @@
       handler.msg());
 
   // Missing sub-command.
-  service_msg = Eval(lib, "[port, ['debug'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['debug'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
@@ -305,7 +317,8 @@
       handler.msg());
 
   // Unrecognized breakpoint.
-  service_msg = Eval(lib, "[port, ['debug', 'breakpoints', '1111'], [], []]");
+  service_msg = Eval(lib,
+                     "[0, port, ['debug', 'breakpoints', '1111'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\","
@@ -317,7 +330,7 @@
 
   // Command too long.
   service_msg =
-      Eval(lib, "[port, ['debug', 'breakpoints', '1111', 'green'], [], []]");
+      Eval(lib, "[0, port, ['debug', 'breakpoints', '1111', 'green'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\","
@@ -328,7 +341,7 @@
                handler.msg());
 
   // Unrecognized subcommand.
-  service_msg = Eval(lib, "[port, ['debug', 'nosferatu'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['debug', 'nosferatu'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\","
@@ -374,7 +387,7 @@
   Instance& service_msg = Instance::Handle();
 
   // null
-  service_msg = Eval(lib, "[port, ['objects', 'null'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['objects', 'null'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -384,7 +397,7 @@
       handler.msg());
 
   // not initialized
-  service_msg = Eval(lib, "[port, ['objects', 'not-initialized'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['objects', 'not-initialized'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -394,7 +407,8 @@
       handler.msg());
 
   // being initialized
-  service_msg = Eval(lib, "[port, ['objects', 'being-initialized'], [], []]");
+  service_msg = Eval(lib,
+                     "[0, port, ['objects', 'being-initialized'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -404,7 +418,7 @@
       handler.msg());
 
   // optimized out
-  service_msg = Eval(lib, "[port, ['objects', 'optimized-out'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['objects', 'optimized-out'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -414,7 +428,7 @@
       handler.msg());
 
   // collected
-  service_msg = Eval(lib, "[port, ['objects', 'collected'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['objects', 'collected'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -424,7 +438,7 @@
       handler.msg());
 
   // expired
-  service_msg = Eval(lib, "[port, ['objects', 'expired'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['objects', 'expired'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -434,7 +448,7 @@
       handler.msg());
 
   // bool
-  service_msg = Eval(lib, "[port, ['objects', 'bool-true'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['objects', 'bool-true'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -445,7 +459,7 @@
       handler.msg());
 
   // int
-  service_msg = Eval(lib, "[port, ['objects', 'int-123'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['objects', 'int-123'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -459,7 +473,7 @@
       handler.msg());
 
   // object id ring / valid
-  service_msg = Eval(lib, "[port, ['objects', '$validId'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['objects', '$validId'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -478,7 +492,7 @@
       handler.msg());
 
   // object id ring / invalid => expired
-  service_msg = Eval(lib, "[port, ['objects', '99999999'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['objects', '99999999'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -488,7 +502,7 @@
       handler.msg());
 
   // expired/eval => error
-  service_msg = Eval(lib, "[port, ['objects', 'expired', 'eval'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['objects', 'expired', 'eval'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -501,7 +515,7 @@
 
   // int/eval => good
   service_msg = Eval(lib,
-                     "[port, ['objects', 'int-123', 'eval'], "
+                     "[0, port, ['objects', 'int-123', 'eval'], "
                      "['expr'], ['this+99']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -516,7 +530,7 @@
 
   // eval returning null works
   service_msg = Eval(lib,
-                     "[port, ['objects', 'int-123', 'eval'], "
+                     "[0, port, ['objects', 'int-123', 'eval'], "
                      "['expr'], ['null']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -527,7 +541,7 @@
       handler.msg());
 
   // object id ring / invalid => expired
-  service_msg = Eval(lib, "[port, ['objects', '99999999', 'eval'], "
+  service_msg = Eval(lib, "[0, port, ['objects', '99999999', 'eval'], "
                      "['expr'], ['this']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -541,7 +555,7 @@
 
   // Extra arg to eval.
   service_msg = Eval(lib,
-                     "[port, ['objects', 'int-123', 'eval', 'foo'], "
+                     "[0, port, ['objects', 'int-123', 'eval', 'foo'], "
                      "['expr'], ['this+99']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -555,7 +569,7 @@
 
   // Retained by single instance.
   service_msg = Eval(lib,
-                     "[port, ['objects', '$validId', 'retained'], [], []]");
+                     "[0, port, ['objects', '$validId', 'retained'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -566,7 +580,7 @@
   // Retaining path to 'arr', limit 1.
   service_msg = Eval(
       lib,
-      "[port, ['objects', '$validId', 'retaining_path'], ['limit'], ['1']]");
+      "[0, port, ['objects', '$validId', 'retaining_path'], ['limit'], ['1']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(
@@ -577,7 +591,7 @@
   // Retaining path missing limit.
   service_msg = Eval(
       lib,
-      "[port, ['objects', '$validId', 'retaining_path'], [], []]");
+      "[0, port, ['objects', '$validId', 'retaining_path'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(), "{\"type\":\"Error\"");
@@ -587,7 +601,7 @@
   internal_object = LiteralToken::New();
   arr.SetAt(0, internal_object);
   service_msg = Eval(lib,
-                     "[port, ['objects', '$validId', 'eval'], "
+                     "[0, port, ['objects', '$validId', 'eval'], "
                      "['expr'], ['toString()']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -635,7 +649,7 @@
 
   // Request library.
   service_msg = EvalF(h_lib,
-                      "[port, ['libraries', '%" Pd "'], [], []]", lib_id);
+                      "[0, port, ['libraries', '%" Pd "'], [], []]", lib_id);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Library\"", handler.msg());
@@ -643,7 +657,7 @@
 
   // Evaluate an expression from a library.
   service_msg = EvalF(h_lib,
-                      "[port, ['libraries', '%" Pd "', 'eval'], "
+                      "[0, port, ['libraries', '%" Pd "', 'eval'], "
                       "['expr'], ['libVar - 1']]", lib_id);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -700,7 +714,7 @@
   Instance& service_msg = Instance::Handle();
 
   // Request an invalid class id.
-  service_msg = Eval(h_lib, "[port, ['classes', '999999'], [], []]");
+  service_msg = Eval(h_lib, "[0, port, ['classes', '999999'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
@@ -710,7 +724,7 @@
     "\"option_keys\":[],\"option_values\":[]}}", handler.msg());
 
   // Request the class A over the service.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "'], [], []]", cid);
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg());
@@ -719,7 +733,7 @@
 
   // Evaluate an expression from class A.
   service_msg = EvalF(h_lib,
-                      "[port, ['classes', '%" Pd "', 'eval'], "
+                      "[0, port, ['classes', '%" Pd "', 'eval'], "
                       "['expr'], ['cobra + 100000']]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -733,8 +747,9 @@
       handler.msg());
 
   // Request function 0 from class A.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '0'],"
-                              "[], []]", cid);
+  service_msg = EvalF(h_lib,
+                      "[0, port, ['classes', '%" Pd "', 'functions', '0'],"
+                      "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg());
@@ -743,7 +758,7 @@
                    "\"name\":\"get:a\",", cid);
 
   // Request field 0 from class A.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'fields', '0'],"
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'fields', '0'],"
                               "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -753,7 +768,7 @@
                    "\"name\":\"a\",", cid);
 
   // Invalid sub command.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'huh', '0'],"
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'huh', '0'],"
                               "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -764,7 +779,7 @@
     "\"option_values\":[]}}", cid);
 
   // Invalid field request.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'fields', '9'],"
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'fields', '9'],"
                               "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -774,8 +789,9 @@
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Invalid function request.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '9'],"
-                              "[], []]", cid);
+  service_msg = EvalF(h_lib,
+                      "[0, port, ['classes', '%" Pd "', 'functions', '9'],"
+                    "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
@@ -785,8 +801,9 @@
 
 
   // Invalid field subcommand.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'fields', '9', 'x']"
-                             ",[], []]", cid);
+  service_msg = EvalF(h_lib,
+                      "[0, port, ['classes', '%" Pd "', 'fields', '9', 'x']"
+                      ",[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
@@ -796,8 +813,9 @@
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Invalid function request.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '9',"
-                             "'x'], [], []]", cid);
+  service_msg = EvalF(h_lib,
+                      "[0, port, ['classes', '%" Pd "', 'functions', '9',"
+                      "'x'], [], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
@@ -811,7 +829,7 @@
   EXPECT(!class_b.IsNull());
   const Instance& b0 = Instance::Handle(Instance::New(class_b));
   const Instance& b1 = Instance::Handle(Instance::New(class_b));
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'retained'],"
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'retained'],"
                       "[], []]", class_b.id());
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -853,7 +871,7 @@
   Instance& service_msg = Instance::Handle();
 
   // Request the class A over the service.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "'], [], []]", cid);
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg());
@@ -862,7 +880,7 @@
                    "\"id\":\"classes\\/%" Pd "\"", cid);
 
   // Request canonical type 0 from class A.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'types', '0'],"
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'types', '0'],"
                               "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -872,7 +890,7 @@
                    "\"id\":\"classes\\/%" Pd "\\/types\\/0\"", cid);
 
   // Request canonical type 1 from class A.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'types', '1'],"
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'types', '1'],"
                               "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -882,7 +900,7 @@
                    "\"id\":\"classes\\/%" Pd "\\/types\\/1\"", cid);
 
   // Request for non-existent canonical type from class A.
-  service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'types', '42'],"
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'types', '42'],"
                               "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -894,7 +912,7 @@
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Request canonical type arguments. Expect <A<bool>> to be listed.
-  service_msg = EvalF(h_lib, "[port, ['typearguments'],"
+  service_msg = EvalF(h_lib, "[0, port, ['typearguments'],"
                               "[], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -902,8 +920,9 @@
   ExpectSubstringF(handler.msg(), "\"name\":\"<A<bool>>\",");
 
   // Request canonical type arguments with instantiations.
-  service_msg = EvalF(h_lib, "[port, ['typearguments', 'withinstantiations'],"
-                              "[], []]");
+  service_msg = EvalF(h_lib,
+                      "[0, port, ['typearguments', 'withinstantiations'],"
+                      "[], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"TypeArgumentsList\"", handler.msg());
@@ -958,7 +977,7 @@
   Instance& service_msg = Instance::Handle();
 
   // Request an invalid code object.
-  service_msg = Eval(h_lib, "[port, ['code', '0'], [], []]");
+  service_msg = Eval(h_lib, "[0, port, ['code', '0'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
@@ -968,7 +987,7 @@
 
   // The following test checks that a code object can be found only
   // at compile_timestamp()-code.EntryPoint().
-  service_msg = EvalF(h_lib, "[port, ['code', '%" Px64"-%" Px "'], [], []]",
+  service_msg = EvalF(h_lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]",
                       compile_timestamp,
                       entry);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -987,7 +1006,7 @@
   // Request code object at compile_timestamp-code.EntryPoint() + 16
   // Expect this to fail because the address is not the entry point.
   uintptr_t address = entry + 16;
-  service_msg = EvalF(h_lib, "[port, ['code', '%" Px64"-%" Px "'], [], []]",
+  service_msg = EvalF(h_lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]",
                       compile_timestamp,
                       address);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -1006,7 +1025,7 @@
   // Request code object at (compile_timestamp - 1)-code.EntryPoint()
   // Expect this to fail because the timestamp is wrong.
   address = entry;
-  service_msg = EvalF(h_lib, "[port, ['code', '%" Px64"-%" Px "'], [], []]",
+  service_msg = EvalF(h_lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]",
                       compile_timestamp - 1,
                       address);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -1024,7 +1043,7 @@
 
   // Request native code at address. Expect the null code object back.
   address = last;
-  service_msg = EvalF(h_lib, "[port, ['code', 'native-%" Px "'], [], []]",
+  service_msg = EvalF(h_lib, "[0, port, ['code', 'native-%" Px "'], [], []]",
                       address);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1033,7 +1052,7 @@
                handler.msg());
 
   // Request malformed native code.
-  service_msg = EvalF(h_lib, "[port, ['code', 'native%" Px "'], [], []]",
+  service_msg = EvalF(h_lib, "[0, port, ['code', 'native%" Px "'], [], []]",
                       address);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1060,18 +1079,68 @@
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   Instance& service_msg = Instance::Handle();
-  service_msg = Eval(lib, "[port, ['vm'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['vm'], [], []]");
 
   Service::HandleRootMessage(service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"VM\",\"id\":\"vm\"", handler.msg());
-  EXPECT_SUBSTRING("\"architecture\"", handler.msg());
+  EXPECT_SUBSTRING("\"targetCPU\"", handler.msg());
+  EXPECT_SUBSTRING("\"hostCPU\"", handler.msg());
   EXPECT_SUBSTRING("\"version\"", handler.msg());
   EXPECT_SUBSTRING("\"uptime\"", handler.msg());
   EXPECT_SUBSTRING("\"isolates\"", handler.msg());
 }
 
 
+TEST_CASE(Service_Flags) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "main() {\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+
+  // 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, SendPort::New(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+
+  Instance& service_msg = Instance::Handle();
+  service_msg = Eval(lib, "[0, port, ['flags'], [], []]");
+
+  // Make sure we can get the FlagList.
+  Service::HandleRootMessage(service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"FlagList\",\"id\":\"flags\"", handler.msg());
+  EXPECT_SUBSTRING(
+      "\"name\":\"service_testing_flag\",\"comment\":\"Comment\","
+      "\"flagType\":\"bool\",\"valueAsString\":\"false\"",
+      handler.msg());
+
+  // Modify a flag through the vm service.
+  service_msg = Eval(lib,
+                     "[0, port, ['flags', 'set'], "
+                     "['name', 'value'], ['service_testing_flag', 'true']]");
+  Service::HandleRootMessage(service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("Success", handler.msg());
+
+  // Make sure that the flag changed.
+  service_msg = Eval(lib, "[0, port, ['flags'], [], []]");
+  Service::HandleRootMessage(service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING(
+      "\"name\":\"service_testing_flag\",\"comment\":\"Comment\","
+      "\"flagType\":\"bool\",\"valueAsString\":\"true\"",
+      handler.msg());
+}
+
+
 TEST_CASE(Service_Scripts) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
@@ -1091,7 +1160,7 @@
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
   Instance& service_msg = Instance::Handle();
-  service_msg = Eval(h_lib, "[port, ['scripts', 'test-lib'], [], []]");
+  service_msg = Eval(h_lib, "[0, port, ['scripts', 'test-lib'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
@@ -1134,7 +1203,7 @@
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
   Instance& service_msg = Instance::Handle();
-  service_msg = Eval(h_lib, "[port, ['coverage'], [], []]");
+  service_msg = Eval(h_lib, "[0, port, ['coverage'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING(
@@ -1175,46 +1244,48 @@
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
   Instance& service_msg = Instance::Handle();
-  service_msg = Eval(h_lib, "[port, ['allocationprofile'], [], []]");
+  service_msg = Eval(h_lib, "[0, port, ['allocationprofile'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
 
   // Too long.
-  service_msg = Eval(h_lib, "[port, ['allocationprofile', 'foo'], [], []]");
+  service_msg = Eval(h_lib, "[0, port, ['allocationprofile', 'foo'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
 
   // Bad gc option.
-  service_msg = Eval(h_lib, "[port, ['allocationprofile'], ['gc'], ['cat']]");
+  service_msg = Eval(h_lib,
+                     "[0, port, ['allocationprofile'], ['gc'], ['cat']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
 
   // Bad reset option.
-  service_msg = Eval(h_lib, "[port, ['allocationprofile'], ['reset'], ['ff']]");
+  service_msg = Eval(h_lib,
+                     "[0, port, ['allocationprofile'], ['reset'], ['ff']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
 
   // Good reset.
   service_msg =
-      Eval(h_lib, "[port, ['allocationprofile'], ['reset'], ['true']]");
+      Eval(h_lib, "[0, port, ['allocationprofile'], ['reset'], ['true']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
 
   // Good GC.
   service_msg =
-      Eval(h_lib, "[port, ['allocationprofile'], ['gc'], ['full']]");
+      Eval(h_lib, "[0, port, ['allocationprofile'], ['gc'], ['full']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
 
   // Good GC and reset.
   service_msg = Eval(h_lib,
-      "[port, ['allocationprofile'], ['gc', 'reset'], ['full', 'true']]");
+      "[0, port, ['allocationprofile'], ['gc', 'reset'], ['full', 'true']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
@@ -1240,7 +1311,7 @@
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   Instance& service_msg = Instance::Handle();
-  service_msg = Eval(lib, "[port, ['heapmap'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['heapmap'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"HeapMap\"", handler.msg());
@@ -1275,7 +1346,7 @@
     uword addr = start_addr + offset;
     char buf[1024];
     OS::SNPrint(buf, sizeof(buf),
-                "[port, ['address', '%" Px "'], [], []]", addr);
+                "[0, port, ['address', '%" Px "'], [], []]", addr);
     service_msg = Eval(lib, buf);
     Service::HandleIsolateMessage(isolate, service_msg);
     handler.HandleNextMessage();
@@ -1283,7 +1354,7 @@
     EXPECT_SUBSTRING("foobar", handler.msg());
   }
   // Expect null when no object is found.
-  service_msg = Eval(lib, "[port, ['address', '7'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['address', '7'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   // TODO(turnidge): Should this be a ServiceException instead?
@@ -1345,11 +1416,11 @@
 
 
   Instance& service_msg = Instance::Handle();
-  service_msg = Eval(lib, "[port, ['alpha'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['alpha'], [], []]");
   Service::HandleRootMessage(service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ("alpha", handler.msg());
-  service_msg = Eval(lib, "[port, ['beta'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['beta'], [], []]");
   Service::HandleRootMessage(service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ("beta", handler.msg());
@@ -1382,11 +1453,11 @@
   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   Instance& service_msg = Instance::Handle();
-  service_msg = Eval(lib, "[port, ['alpha'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['alpha'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ("alpha", handler.msg());
-  service_msg = Eval(lib, "[port, ['beta'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['beta'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ("beta", handler.msg());
@@ -1423,19 +1494,19 @@
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
   Instance& service_msg = Instance::Handle();
-  service_msg = Eval(h_lib, "[port, ['profile'], [], []]");
+  service_msg = Eval(h_lib, "[0, 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_msg = Eval(h_lib, "[0, 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_msg = Eval(h_lib, "[0, port, ['profile'], ['tags'], ['hidden']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   // Expect error.
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 82b3880..18d5898 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -2142,6 +2142,14 @@
       result64 = rn_val64;
       result32 = rn_val32;
     }
+  } else if ((instr->Bits(29, 2) == 2) && (instr->Bits(10, 2) == 0)) {
+    // Format(instr, "csinv'sf'cond 'rd, 'rn, 'rm");
+    result64 = ~rm_val64;
+    result32 = ~rm_val32;
+    if (ConditionallyExecute(instr)) {
+      result64 = rn_val64;
+      result32 = rn_val32;
+    }
   } else {
     UnimplementedInstruction(instr);
     return;
@@ -2319,6 +2327,35 @@
       } else if ((U == 1) && (opcode == 0x1f)) {
         // Format(instr, "vdiv'vsz 'vd, 'vn, 'vm");
         res = bit_cast<int32_t, float>(vn_flt / vm_flt);
+      } else if ((U == 0) && (opcode == 0x1c)) {
+        // Format(instr, "vceq'vsz 'vd, 'vn, 'vm");
+        res = (vn_flt == vm_flt) ? 0xffffffff : 0;
+      } else if ((U == 1) && (opcode == 0x1c)) {
+        if (instr->Bit(23) == 1) {
+          // Format(instr, "vcgt'vsz 'vd, 'vn, 'vm");
+          res = (vn_flt > vm_flt) ? 0xffffffff : 0;
+        } else {
+          // Format(instr, "vcge'vsz 'vd, 'vn, 'vm");
+          res = (vn_flt >= vm_flt) ? 0xffffffff : 0;
+        }
+      } else if ((U == 0) && (opcode == 0x1e)) {
+        if (instr->Bit(23) == 1) {
+          // Format(instr, "vmin'vsz 'vd, 'vn, 'vm");
+          const float m = (vn_flt > vm_flt) ? vm_flt : vn_flt;
+          res = bit_cast<int32_t, float>(m);
+        } else {
+          // Format(instr, "vmax'vsz 'vd, 'vn, 'vm");
+          const float m = (vn_flt < vm_flt) ? vm_flt : vn_flt;
+          res = bit_cast<int32_t, float>(m);
+        }
+      } else if ((U == 0) && (opcode == 0x1f)) {
+        if (instr->Bit(23) == 0) {
+          // Format(instr, "vrecps'vsz 'vd, 'vn, 'vm");
+          res = bit_cast<int32_t, float>(2.0 - (vn_flt * vm_flt));
+        } else {
+          // Format(instr, "vrsqrt'vsz 'vd, 'vn, 'vm");
+          res = bit_cast<int32_t, float>((3.0 - vn_flt * vm_flt) / 2.0);
+        }
       } else {
         UnimplementedInstruction(instr);
         return;
@@ -2364,6 +2401,27 @@
       } else if ((U == 1) && (opcode == 0x1f)) {
         // Format(instr, "vdiv'vsz 'vd, 'vn, 'vm");
         res = bit_cast<int64_t, double>(vn_dbl / vm_dbl);
+      } else if ((U == 0) && (opcode == 0x1c)) {
+        // Format(instr, "vceq'vsz 'vd, 'vn, 'vm");
+        res = (vn_dbl == vm_dbl) ? 0xffffffffffffffffLL : 0;
+      } else if ((U == 1) && (opcode == 0x1c)) {
+        if (instr->Bit(23) == 1) {
+          // Format(instr, "vcgt'vsz 'vd, 'vn, 'vm");
+          res = (vn_dbl > vm_dbl) ? 0xffffffffffffffffLL : 0;
+        } else {
+          // Format(instr, "vcge'vsz 'vd, 'vn, 'vm");
+          res = (vn_dbl >= vm_dbl) ? 0xffffffffffffffffLL : 0;
+        }
+      } else if ((U == 0) && (opcode == 0x1e)) {
+        if (instr->Bit(23) == 1) {
+          // Format(instr, "vmin'vsz 'vd, 'vn, 'vm");
+          const double m = (vn_dbl > vm_dbl) ? vm_dbl : vn_dbl;
+          res = bit_cast<int64_t, double>(m);
+        } else {
+          // Format(instr, "vmax'vsz 'vd, 'vn, 'vm");
+          const double m = (vn_dbl < vm_dbl) ? vm_dbl : vn_dbl;
+          res = bit_cast<int64_t, double>(m);
+        }
       } else {
         UnimplementedInstruction(instr);
         return;
@@ -2374,6 +2432,91 @@
 }
 
 
+static float arm_reciprocal_sqrt_estimate(float a) {
+  // From the ARM Architecture Reference Manual A2-87.
+  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
+  else if (a == 0.0) return INFINITY;
+  else if (isnan(a)) return a;
+
+  uint32_t a_bits = bit_cast<uint32_t, float>(a);
+  uint64_t scaled;
+  if (((a_bits >> 23) & 1) != 0) {
+    // scaled = '0 01111111101' : operand<22:0> : Zeros(29)
+    scaled = (static_cast<uint64_t>(0x3fd) << 52) |
+             ((static_cast<uint64_t>(a_bits) & 0x7fffff) << 29);
+  } else {
+    // scaled = '0 01111111110' : operand<22:0> : Zeros(29)
+    scaled = (static_cast<uint64_t>(0x3fe) << 52) |
+             ((static_cast<uint64_t>(a_bits) & 0x7fffff) << 29);
+  }
+  // result_exp = (380 - UInt(operand<30:23>) DIV 2;
+  int32_t result_exp = (380 - ((a_bits >> 23) & 0xff)) / 2;
+
+  double scaled_d = bit_cast<double, uint64_t>(scaled);
+  ASSERT((scaled_d >= 0.25) && (scaled_d < 1.0));
+
+  double r;
+  if (scaled_d < 0.5) {
+    // range 0.25 <= a < 0.5
+
+    // a in units of 1/512 rounded down.
+    int32_t q0 = static_cast<int32_t>(scaled_d * 512.0);
+    // reciprocal root r.
+    r = 1.0 / sqrt((static_cast<double>(q0) + 0.5) / 512.0);
+  } else {
+    // range 0.5 <= a < 1.0
+
+    // a in units of 1/256 rounded down.
+    int32_t q1 = static_cast<int32_t>(scaled_d * 256.0);
+    // reciprocal root r.
+    r = 1.0 / sqrt((static_cast<double>(q1) + 0.5) / 256.0);
+  }
+  // r in units of 1/256 rounded to nearest.
+  int32_t s = static_cast<int>(256.0 * r + 0.5);
+  double estimate = static_cast<double>(s) / 256.0;
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+
+  // result = 0 : result_exp<7:0> : estimate<51:29>
+  int32_t result_bits = ((result_exp & 0xff) << 23) |
+      ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff);
+  return bit_cast<float, int32_t>(result_bits);
+}
+
+
+static float arm_recip_estimate(float a) {
+  // From the ARM Architecture Reference Manual A2-85.
+  if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0;
+  else if (a == 0.0) return INFINITY;
+  else if (isnan(a)) return a;
+
+  uint32_t a_bits = bit_cast<uint32_t, float>(a);
+  // scaled = '0011 1111 1110' : a<22:0> : Zeros(29)
+  uint64_t scaled = (static_cast<uint64_t>(0x3fe) << 52) |
+                    ((static_cast<uint64_t>(a_bits) & 0x7fffff) << 29);
+  // result_exp = 253 - UInt(a<30:23>)
+  int32_t result_exp = 253 - ((a_bits >> 23) & 0xff);
+  ASSERT((result_exp >= 1) && (result_exp <= 252));
+
+  double scaled_d = bit_cast<double, uint64_t>(scaled);
+  ASSERT((scaled_d >= 0.5) && (scaled_d < 1.0));
+
+  // a in units of 1/512 rounded down.
+  int32_t q = static_cast<int32_t>(scaled_d * 512.0);
+  // reciprocal r.
+  double r = 1.0 / ((static_cast<double>(q) + 0.5) / 512.0);
+  // r in units of 1/256 rounded to nearest.
+  int32_t s = static_cast<int32_t>(256.0 * r + 0.5);
+  double estimate = static_cast<double>(s) / 256.0;
+  ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0)));
+
+  // result = sign : result_exp<7:0> : estimate<51:29>
+  int32_t result_bits =
+      (a_bits & 0x80000000) | ((result_exp & 0xff) << 23) |
+      ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff);
+  return bit_cast<float, int32_t>(result_bits);
+}
+
+
 void Simulator::DecodeSIMDTwoReg(Instr* instr) {
   const int32_t Q = instr->Bit(30);
   const int32_t U = instr->Bit(29);
@@ -2382,7 +2525,12 @@
   const VRegister vd = instr->VdField();
   const VRegister vn = instr->VnField();
 
-  if ((Q == 1) && (U == 1) && (op == 5)) {
+  if (Q != 1) {
+    UnimplementedInstruction(instr);
+    return;
+  }
+
+  if ((U == 1) && (op == 5)) {
     // Format(instr, "vnot 'vd, 'vn");
     for (int i = 0; i < 2; i++) {
       set_vregisterd(vd, i, ~get_vregisterd(vn, i));
@@ -2423,6 +2571,48 @@
     } else {
       UnimplementedInstruction(instr);
     }
+  } else if ((U == 1) && (op == 0x1f)) {
+    if (sz == 2) {
+      // Format(instr, "vsqrts 'vd, 'vn");
+      for (int i = 0; i < 4; i++) {
+        const int32_t vn_val = get_vregisters(vn, i);
+        const float vn_flt = bit_cast<float, int32_t>(vn_val);
+        set_vregisters(vd, i, bit_cast<int32_t, float>(sqrtf(vn_flt)));
+      }
+    } else if (sz == 3) {
+      // Format(instr, "vsqrtd 'vd, 'vn");
+      for (int i = 0; i < 2; i++) {
+        const int64_t vn_val = get_vregisterd(vn, i);
+        const double vn_dbl = bit_cast<double, int64_t>(vn_val);
+        set_vregisterd(vd, i, bit_cast<int64_t, double>(sqrt(vn_dbl)));
+      }
+    } else {
+      UnimplementedInstruction(instr);
+    }
+  } else if ((U == 0) && (op == 0x1d)) {
+    if (sz != 2) {
+      UnimplementedInstruction(instr);
+      return;
+    }
+    // Format(instr, "vrecpes 'vd, 'vn");
+    for (int i = 0; i < 4; i++) {
+      const int32_t vn_val = get_vregisters(vn, i);
+      const float vn_flt = bit_cast<float, int32_t>(vn_val);
+      const float re = arm_recip_estimate(vn_flt);
+      set_vregisters(vd, i, bit_cast<int32_t, float>(re));
+    }
+  } else if ((U == 1) && (op == 0x1d)) {
+    if (sz != 2) {
+      UnimplementedInstruction(instr);
+      return;
+    }
+    // Format(instr, "vrsqrtes 'vd, 'vn");
+    for (int i = 0; i < 4; i++) {
+      const int32_t vn_val = get_vregisters(vn, i);
+      const float vn_flt = bit_cast<float, int32_t>(vn_val);
+      const float re = arm_reciprocal_sqrt_estimate(vn_flt);
+      set_vregisters(vd, i, bit_cast<int32_t, float>(re));
+    }
   } else {
     UnimplementedInstruction(instr);
   }
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 3542f73..d7b0030 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -22,11 +22,11 @@
 #undef STUB_CODE_DECLARE
 
 
-StubEntry::StubEntry(const char* name, const Code& code)
+StubEntry::StubEntry(const Code& code)
     : code_(code.raw()),
       entry_point_(code.EntryPoint()),
       size_(code.Size()),
-      label_(name, code.EntryPoint()) {
+      label_(code.EntryPoint()) {
 }
 
 
@@ -47,7 +47,7 @@
 
 #define STUB_CODE_GENERATE(name)                                               \
   code ^= Generate("_stub_"#name, StubCode::Generate##name##Stub);             \
-  name##_entry_ = new StubEntry("_stub_"#name, code);
+  name##_entry_ = new StubEntry(code);
 
 
 void StubCode::InitOnce() {
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 6454974..bc3f469 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -68,7 +68,7 @@
 // abstract out common code executed from generated dart code.
 class StubEntry {
  public:
-  StubEntry(const char* name, const Code& code);
+  explicit StubEntry(const Code& code);
   ~StubEntry() {}
 
   const ExternalLabel& label() const { return label_; }
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 1edcd2b..797c286 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -43,7 +43,7 @@
   const intptr_t retval_offset = NativeArguments::retval_offset();
   const intptr_t exitframe_last_param_slot_from_fp = 2;
 
-  __ mov(IP, ShifterOperand(0));
+  __ mov(IP, Operand(0));
   __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
@@ -58,7 +58,7 @@
   __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset());
 
   // Cache Isolate pointer into CTX while executing runtime code.
-  __ mov(CTX, ShifterOperand(R0));
+  __ mov(CTX, Operand(R0));
 
 #if defined(DEBUG)
   { Label ok;
@@ -88,15 +88,15 @@
   // There are no runtime calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
   ASSERT(argc_tag_offset == 1 * kWordSize);
-  __ mov(R1, ShifterOperand(R4));  // Set argc in NativeArguments.
+  __ mov(R1, Operand(R4));  // Set argc in NativeArguments.
 
   ASSERT(argv_offset == 2 * kWordSize);
-  __ add(R2, FP, ShifterOperand(R4, LSL, 2));  // Compute argv.
+  __ add(R2, FP, Operand(R4, LSL, 2));  // Compute argv.
   // Set argv in NativeArguments.
   __ AddImmediate(R2, exitframe_last_param_slot_from_fp * kWordSize);
 
   ASSERT(retval_offset == 3 * kWordSize);
-  __ add(R3, R2, ShifterOperand(kWordSize));  // Retval is next to 1st argument.
+  __ add(R3, R2, Operand(kWordSize));  // Retval is next to 1st argument.
 
   // Call runtime or redirection via simulator.
   __ blx(R5);
@@ -117,7 +117,7 @@
   __ StoreToOffset(kWord, R3, CTX, Isolate::top_context_offset());
 
   // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, ShifterOperand(R2));
+  __ mov(CTX, Operand(R2));
 
   __ LeaveFrame((1 << FP) | (1 << LR));
   // Adjust SP for the empty PC marker.
@@ -157,7 +157,7 @@
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
 
-  __ mov(IP, ShifterOperand(0));
+  __ mov(IP, Operand(0));
   __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
@@ -172,7 +172,7 @@
   __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset());
 
   // Cache Isolate pointer into CTX while executing native code.
-  __ mov(CTX, ShifterOperand(R0));
+  __ mov(CTX, Operand(R0));
 
 #if defined(DEBUG)
   { Label ok;
@@ -208,13 +208,13 @@
   // Set argv in NativeArguments: R2 already contains argv.
 
   ASSERT(retval_offset == 3 * kWordSize);
-  __ add(R3, FP, ShifterOperand(3 * kWordSize));  // Set retval in NativeArgs.
+  __ add(R3, FP, Operand(3 * kWordSize));  // Set retval in NativeArgs.
 
-  // TODO(regis): Should we pass the structure by value as in runtime calls?
-  // It would require changing Dart API for native functions.
+  // Passing the structure by value as in runtime calls would require changing
+  // Dart API for native functions.
   // For now, space is reserved on the stack and we pass a pointer to it.
   __ stm(IA, SP,  (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3));
-  __ mov(R0, ShifterOperand(SP));  // Pass the pointer to the NativeArguments.
+  __ mov(R0, Operand(SP));  // Pass the pointer to the NativeArguments.
 
   // Call native function (setsup scope if not leaf function).
   Label leaf_call;
@@ -222,7 +222,7 @@
   __ TestImmediate(R1, NativeArguments::AutoSetupScopeMask());
   __ b(&leaf_call, EQ);
 
-  __ mov(R1, ShifterOperand(R5));  // Pass the function entrypoint to call.
+  __ mov(R1, Operand(R5));  // Pass the function entrypoint to call.
   // Call native function invocation wrapper or redirection via simulator.
 #if defined(USING_SIMULATOR)
   uword entry = reinterpret_cast<uword>(NativeEntry::NativeCallWrapper);
@@ -257,7 +257,7 @@
   __ StoreToOffset(kWord, R3, CTX, Isolate::top_context_offset());
 
   // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, ShifterOperand(R2));
+  __ mov(CTX, Operand(R2));
 
   __ LeaveFrame((1 << FP) | (1 << LR));
   // Adjust SP for the empty PC marker.
@@ -278,7 +278,7 @@
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
 
-  __ mov(IP, ShifterOperand(0));
+  __ mov(IP, Operand(0));
   __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
@@ -293,7 +293,7 @@
   __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset());
 
   // Cache Isolate pointer into CTX while executing native code.
-  __ mov(CTX, ShifterOperand(R0));
+  __ mov(CTX, Operand(R0));
 
 #if defined(DEBUG)
   { Label ok;
@@ -329,13 +329,13 @@
   // Set argv in NativeArguments: R2 already contains argv.
 
   ASSERT(retval_offset == 3 * kWordSize);
-  __ add(R3, FP, ShifterOperand(3 * kWordSize));  // Set retval in NativeArgs.
+  __ add(R3, FP, Operand(3 * kWordSize));  // Set retval in NativeArgs.
 
-  // TODO(regis): Should we pass the structure by value as in runtime calls?
-  // It would require changing Dart API for native functions.
+  // Passing the structure by value as in runtime calls would require changing
+  // Dart API for native functions.
   // For now, space is reserved on the stack and we pass a pointer to it.
   __ stm(IA, SP,  (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3));
-  __ mov(R0, ShifterOperand(SP));  // Pass the pointer to the NativeArguments.
+  __ mov(R0, Operand(SP));  // Pass the pointer to the NativeArguments.
 
   // Call native function or redirection via simulator.
   __ blx(R5);
@@ -356,7 +356,7 @@
   __ StoreToOffset(kWord, R3, CTX, Isolate::top_context_offset());
 
   // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, ShifterOperand(R2));
+  __ mov(CTX, Operand(R2));
 
   __ LeaveFrame((1 << FP) | (1 << LR));
   // Adjust SP for the empty PC marker.
@@ -420,14 +420,14 @@
   // R0: newly allocated array.
   // R2: smi-tagged argument count, may be zero (was preserved by the stub).
   __ Push(R0);  // Array is in R0 and on top of stack.
-  __ add(R1, FP, ShifterOperand(R2, LSL, 1));
+  __ add(R1, FP, Operand(R2, LSL, 1));
   __ AddImmediate(R1, kParamEndSlotFromFp * kWordSize);
   __ AddImmediate(R3, R0, Array::data_offset() - kHeapObjectTag);
   // R1: address of first argument on stack.
   // R3: address of first argument in array.
   Label loop;
   __ Bind(&loop);
-  __ subs(R2, R2, ShifterOperand(Smi::RawValue(1)));  // R2 is Smi.
+  __ subs(R2, R2, Operand(Smi::RawValue(1)));  // R2 is Smi.
   __ ldr(IP, Address(R1, 0), PL);
   __ str(IP, Address(R3, 0), PL);
   __ AddImmediate(R1, -kWordSize, PL);
@@ -471,8 +471,8 @@
                                            bool preserve_result) {
   // DeoptimizeCopyFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
   // is no need to set the correct PC marker or load PP, since they get patched.
-  __ mov(IP, ShifterOperand(LR));
-  __ mov(LR, ShifterOperand(0));
+  __ mov(IP, Operand(LR));
+  __ mov(LR, Operand(0));
   __ EnterFrame((1 << PP) | (1 << FP) | (1 << IP) | (1 << LR), 0);
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
@@ -480,9 +480,6 @@
       kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - R0);
   // Result in R0 is preserved as part of pushing all registers below.
 
-  // TODO(regis): Should we align the stack before pushing the fpu registers?
-  // If we do, saved_r0_offset_from_fp is not constant anymore.
-
   // Push registers in their enumeration order: lowest register number at
   // lowest address.
   __ PushList(kAllCpuRegistersList);
@@ -499,7 +496,7 @@
     __ AddImmediate(SP, SP, -kNumberOfFpuRegisters * kFpuRegisterSize);
   }
 
-  __ mov(R0, ShifterOperand(SP));  // Pass address of saved registers block.
+  __ mov(R0, Operand(SP));  // Pass address of saved registers block.
   __ ReserveAlignedFrameSpace(0);
   __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
   // Result (R0) is stack-size (FP - SP) in bytes.
@@ -510,14 +507,14 @@
   }
 
   __ LeaveDartFrame();
-  __ sub(SP, FP, ShifterOperand(R0));
+  __ sub(SP, FP, Operand(R0));
 
   // DeoptimizeFillFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
   // is no need to set the correct PC marker or load PP, since they get patched.
-  __ mov(IP, ShifterOperand(LR));
-  __ mov(LR, ShifterOperand(0));
+  __ mov(IP, Operand(LR));
+  __ mov(LR, Operand(0));
   __ EnterFrame((1 << PP) | (1 << FP) | (1 << IP) | (1 << LR), 0);
-  __ mov(R0, ShifterOperand(FP));  // Get last FP address.
+  __ mov(R0, Operand(FP));  // Get last FP address.
   if (preserve_result) {
     __ Push(R1);  // Preserve result as first local.
   }
@@ -547,7 +544,7 @@
   }
   __ LeaveStubFrame();
   // Remove materialization arguments.
-  __ add(SP, SP, ShifterOperand(R1, ASR, kSmiTagSize));
+  __ add(SP, SP, Operand(R1, ASR, kSmiTagSize));
   __ Ret();
 }
 
@@ -570,7 +567,7 @@
 
   // Load the receiver.
   __ ldr(R2, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-  __ add(IP, FP, ShifterOperand(R2, LSL, 1));  // R2 is Smi.
+  __ add(IP, FP, Operand(R2, LSL, 1));  // R2 is Smi.
   __ ldr(R6, Address(IP, kParamEndSlotFromFp * kWordSize));
 
   // Preserve IC data and arguments descriptor.
@@ -615,9 +612,9 @@
   __ MoveRegister(R3, R2);   // Array length.
 
   // Check that length is a positive Smi.
-  __ tst(R3, ShifterOperand(kSmiTagMask));
+  __ tst(R3, Operand(kSmiTagMask));
   __ b(&slow_case, NE);
-  __ cmp(R3, ShifterOperand(0));
+  __ cmp(R3, Operand(0));
   __ b(&slow_case, LT);
 
   // Check for maximum allowed length.
@@ -628,9 +625,9 @@
 
   const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
   __ LoadImmediate(R8, fixed_size);
-  __ add(R8, R8, ShifterOperand(R3, LSL, 1));  // R3 is  a Smi.
+  __ add(R8, R8, Operand(R3, LSL, 1));  // R3 is  a Smi.
   ASSERT(kSmiTagShift == 1);
-  __ bic(R8, R8, ShifterOperand(kObjectAlignment - 1));
+  __ bic(R8, R8, Operand(kObjectAlignment - 1));
 
   // R8: Allocation size.
 
@@ -639,7 +636,7 @@
 
   __ LoadImmediate(R6, heap->TopAddress());
   __ ldr(R0, Address(R6, 0));  // Potential new object start.
-  __ adds(R7, R0, ShifterOperand(R8));  // Potential next object start.
+  __ adds(R7, R0, Operand(R8));  // Potential next object start.
   __ b(&slow_case, VS);
 
   // Check if the allocation fits into the remaining space.
@@ -648,13 +645,13 @@
   // R8: allocation size.
   __ LoadImmediate(R3, heap->EndAddress());
   __ ldr(R3, Address(R3, 0));
-  __ cmp(R7, ShifterOperand(R3));
+  __ cmp(R7, Operand(R3));
   __ b(&slow_case, CS);
 
   // Successfully allocated the object(s), now update top to point to
   // next object start and initialize the object.
   __ str(R7, Address(R6, 0));
-  __ add(R0, R0, ShifterOperand(kHeapObjectTag));
+  __ add(R0, R0, Operand(kHeapObjectTag));
   __ UpdateAllocationStatsWithSize(kArrayCid, R8, R4);
 
   // Initialize the tags.
@@ -666,13 +663,13 @@
     const Class& cls = Class::Handle(isolate->object_store()->array_class());
 
     __ CompareImmediate(R8, RawObject::SizeTag::kMaxSizeTag);
-    __ mov(R8, ShifterOperand(R8, LSL, shift), LS);
-    __ mov(R8, ShifterOperand(0), HI);
+    __ mov(R8, Operand(R8, LSL, shift), LS);
+    __ mov(R8, Operand(0), HI);
 
     // Get the class index and insert it into the tags.
     // R8: size and bit tags.
     __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
-    __ orr(R8, R8, ShifterOperand(TMP));
+    __ orr(R8, R8, Operand(TMP));
     __ str(R8, FieldAddress(R0, Array::tags_offset()));  // Store tags.
   }
 
@@ -699,7 +696,7 @@
 
   Label init_loop;
   __ Bind(&init_loop);
-  __ cmp(R8, ShifterOperand(R7));
+  __ cmp(R8, Operand(R7));
   __ str(R3, Address(R8, 0), CC);
   __ AddImmediate(R8, kWordSize, CC);
   __ b(&init_loop, CC);
@@ -719,7 +716,7 @@
   __ CallRuntime(kAllocateArrayRuntimeEntry, 2);
   // Pop arguments; result is popped in IP.
   __ PopList((1 << R1) | (1 << R2) | (1 << IP));  // R2 is restored.
-  __ mov(R0, ShifterOperand(IP));
+  __ mov(R0, Operand(IP));
   __ LeaveStubFrame();
   __ Ret();
 }
@@ -747,8 +744,7 @@
     // Save FPU registers. 2 D registers per Q register.
     __ vstmd(DB_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
   } else {
-    __ sub(SP, SP,
-           ShifterOperand(kAbiPreservedFpuRegCount * kFpuRegisterSize));
+    __ sub(SP, SP, Operand(kAbiPreservedFpuRegCount * kFpuRegisterSize));
   }
 
   // We now load the pool pointer(PP) as we are about to invoke dart code and we
@@ -818,7 +814,7 @@
   __ Push(R3);
   __ AddImmediate(R2, kWordSize);
   __ AddImmediate(R1, 1);
-  __ cmp(R1, ShifterOperand(R5));
+  __ cmp(R1, Operand(R5));
   __ b(&push_arguments, LT);
   __ Bind(&done_push_arguments);
 
@@ -852,8 +848,7 @@
     // Restore FPU registers. 2 D registers per Q register.
     __ vldmd(IA_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
   } else {
-    __ add(SP, SP,
-       ShifterOperand(kAbiPreservedFpuRegCount * kFpuRegisterSize));
+    __ AddImmediate(SP, kAbiPreservedFpuRegCount * kFpuRegisterSize);
   }
   // Restore CPU registers.
   __ PopList((1 << R3) | kAbiPreservedCpuRegs);  // Ignore restored R3.
@@ -878,16 +873,16 @@
     // R1: number of context variables.
     intptr_t fixed_size = sizeof(RawContext) + kObjectAlignment - 1;
     __ LoadImmediate(R2, fixed_size);
-    __ add(R2, R2, ShifterOperand(R1, LSL, 2));
+    __ add(R2, R2, Operand(R1, LSL, 2));
     ASSERT(kSmiTagShift == 1);
-    __ bic(R2, R2, ShifterOperand(kObjectAlignment - 1));
+    __ bic(R2, R2, Operand(kObjectAlignment - 1));
 
     // Now allocate the object.
     // R1: number of context variables.
     // R2: object size.
     __ LoadImmediate(R5, heap->TopAddress());
     __ ldr(R0, Address(R5, 0));
-    __ add(R3, R2, ShifterOperand(R0));
+    __ add(R3, R2, Operand(R0));
     // Check if the allocation fits into the remaining space.
     // R0: potential new object.
     // R1: number of context variables.
@@ -895,7 +890,7 @@
     // R3: potential next object start.
     __ LoadImmediate(IP, heap->EndAddress());
     __ ldr(IP, Address(IP, 0));
-    __ cmp(R3, ShifterOperand(IP));
+    __ cmp(R3, Operand(IP));
     if (FLAG_use_slow_path) {
       __ b(&slow_case);
     } else {
@@ -909,7 +904,7 @@
     // R2: object size.
     // R3: next object start.
     __ str(R3, Address(R5, 0));
-    __ add(R0, R0, ShifterOperand(kHeapObjectTag));
+    __ add(R0, R0, Operand(kHeapObjectTag));
     __ UpdateAllocationStatsWithSize(context_class.id(), R2, R5);
 
     // Calculate the size tag.
@@ -919,13 +914,13 @@
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
     __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag);
     // If no size tag overflow, shift R2 left, else set R2 to zero.
-    __ mov(R2, ShifterOperand(R2, LSL, shift), LS);
-    __ mov(R2, ShifterOperand(0), HI);
+    __ mov(R2, Operand(R2, LSL, shift), LS);
+    __ mov(R2, Operand(0), HI);
 
     // Get the class index and insert it into the tags.
     // R2: size and bit tags.
     __ LoadImmediate(IP, RawObject::ClassIdTag::encode(context_class.id()));
-    __ orr(R2, R2, ShifterOperand(IP));
+    __ orr(R2, R2, Operand(IP));
     __ str(R2, FieldAddress(R0, Context::tags_offset()));
 
     // Setup up number of context variables field.
@@ -954,7 +949,7 @@
     Label loop;
     __ AddImmediate(R3, R0, Context::variable_offset(0) - kHeapObjectTag);
     __ Bind(&loop);
-    __ subs(R1, R1, ShifterOperand(1));
+    __ subs(R1, R1, Operand(1));
     __ str(R2, Address(R3, R1, LSL, 2), PL);  // Store if R1 positive or zero.
     __ b(&loop, NE);  // Loop if R1 not zero.
 
@@ -996,13 +991,13 @@
   // Spilled: R1, R2, R3
   // R0: Address being stored
   __ ldr(R2, FieldAddress(R0, Object::tags_offset()));
-  __ tst(R2, ShifterOperand(1 << RawObject::kRememberedBit));
+  __ tst(R2, Operand(1 << RawObject::kRememberedBit));
   __ b(&add_to_buffer, EQ);
   __ PopList((1 << R1) | (1 << R2) | (1 << R3));
   __ Ret();
 
   __ Bind(&add_to_buffer);
-  __ orr(R2, R2, ShifterOperand(1 << RawObject::kRememberedBit));
+  __ orr(R2, R2, Operand(1 << RawObject::kRememberedBit));
   __ str(R2, FieldAddress(R0, Object::tags_offset()));
 
   // Load the isolate out of the context.
@@ -1015,14 +1010,14 @@
   // R1: isolate.
   __ ldr(R1, Address(R1, Isolate::store_buffer_offset()));
   __ ldr(R2, Address(R1, StoreBufferBlock::top_offset()));
-  __ add(R3, R1, ShifterOperand(R2, LSL, 2));
+  __ add(R3, R1, Operand(R2, LSL, 2));
   __ str(R0, Address(R3, StoreBufferBlock::pointers_offset()));
 
   // Increment top_ and check for overflow.
   // R2: top_.
   // R1: StoreBufferBlock.
   Label L;
-  __ add(R2, R2, ShifterOperand(1));
+  __ add(R2, R2, Operand(1));
   __ str(R2, Address(R1, StoreBufferBlock::top_offset()));
   __ CompareImmediate(R2, StoreBufferBlock::kSize);
   // Restore values.
@@ -1077,7 +1072,7 @@
     // R3: potential next object start.
     __ LoadImmediate(IP, heap->EndAddress());
     __ ldr(IP, Address(IP, 0));
-    __ cmp(R3, ShifterOperand(IP));
+    __ cmp(R3, Operand(IP));
     if (FLAG_use_slow_path) {
       __ b(&slow_case);
     } else {
@@ -1114,7 +1109,7 @@
         __ StoreToOffset(kWord, R0, R2, current_offset);
       }
     } else {
-      __ add(R4, R2, ShifterOperand(Instance::NextFieldOffset()));
+      __ add(R4, R2, Operand(Instance::NextFieldOffset()));
       // Loop until the whole object is initialized.
       // R0: raw null.
       // R2: new object.
@@ -1124,7 +1119,7 @@
       Label init_loop;
       Label done;
       __ Bind(&init_loop);
-      __ cmp(R4, ShifterOperand(R3));
+      __ cmp(R4, Operand(R3));
       __ b(&done, CS);
       __ str(R0, Address(R4, 0));
       __ AddImmediate(R4, kWordSize);
@@ -1138,7 +1133,7 @@
     }
     // Done allocating and initializing the instance.
     // R2: new object still missing its heap tag.
-    __ add(R0, R2, ShifterOperand(kHeapObjectTag));
+    __ add(R0, R2, Operand(kHeapObjectTag));
     // R0: new object.
     __ Ret();
 
@@ -1182,7 +1177,7 @@
 
   // Load the receiver.
   __ ldr(R2, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-  __ add(IP, FP, ShifterOperand(R2, LSL, 1));  // R2 is Smi.
+  __ add(IP, FP, Operand(R2, LSL, 1));  // R2 is Smi.
   __ ldr(R6, Address(IP, kParamEndSlotFromFp * kWordSize));
 
   // Push space for the return value.
@@ -1222,7 +1217,7 @@
     __ LeaveStubFrame();
   }
   __ ldr(R7, FieldAddress(func_reg, Function::usage_counter_offset()));
-  __ add(R7, R7, ShifterOperand(1));
+  __ add(R7, R7, Operand(1));
   __ str(R7, FieldAddress(func_reg, Function::usage_counter_offset()));
 }
 
@@ -1235,7 +1230,7 @@
   ASSERT(temp_reg == R6);
   __ ldr(func_reg, FieldAddress(ic_reg, ICData::owner_offset()));
   __ ldr(R7, FieldAddress(func_reg, Function::usage_counter_offset()));
-  __ add(R7, R7, ShifterOperand(1));
+  __ add(R7, R7, Operand(1));
   __ str(R7, FieldAddress(func_reg, Function::usage_counter_offset()));
 }
 
@@ -1261,7 +1256,7 @@
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ ldr(R6, FieldAddress(R5, ICData::state_bits_offset()));
     ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
-    __ and_(R6, R6, ShifterOperand(ICData::NumArgsTestedMask()));
+    __ and_(R6, R6, Operand(ICData::NumArgsTestedMask()));
     __ CompareImmediate(R6, num_args);
     __ b(&ok, EQ);
     __ Stop("Incorrect stub for IC data");
@@ -1287,7 +1282,7 @@
   // Load arguments descriptor into R4.
   __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
   // Preserve return address, since LR is needed for subroutine call.
-  __ mov(R8, ShifterOperand(LR));
+  __ mov(R8, Operand(LR));
   // Loop that checks if there is an IC data match.
   Label loop, update, test, found, get_class_id_as_smi;
   // R5: IC data object (preserved).
@@ -1299,7 +1294,7 @@
   // Get the receiver's class ID (first read number of arguments from
   // arguments descriptor array and then access the receiver from the stack).
   __ ldr(R7, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-  __ sub(R7, R7, ShifterOperand(Smi::RawValue(1)));
+  __ sub(R7, R7, Operand(Smi::RawValue(1)));
   __ ldr(R0, Address(SP, R7, LSL, 1));  // R7 (argument_count - 1) is smi.
   __ bl(&get_class_id_as_smi);
   // R7: argument_count - 1 (smi).
@@ -1318,12 +1313,12 @@
       __ LoadFromOffset(kWord, R1, R6, i * kWordSize);
       // R1: next class ID to check (smi).
     }
-    __ cmp(R0, ShifterOperand(R1));  // Class id match?
+    __ cmp(R0, Operand(R1));  // Class id match?
     if (i < (num_args - 1)) {
       __ b(&update, NE);  // Continue.
     } else {
       // Last check, all checks before matched.
-      __ mov(LR, ShifterOperand(R8), EQ);  // Restore return address if found.
+      __ mov(LR, Operand(R8), EQ);  // Restore return address if found.
       __ b(&found, EQ);  // Break.
     }
   }
@@ -1344,11 +1339,11 @@
 
   // IC miss.
   // Restore return address.
-  __ mov(LR, ShifterOperand(R8));
+  __ mov(LR, Operand(R8));
 
   // Compute address of arguments.
   // R7: argument_count - 1 (smi).
-  __ add(R7, SP, ShifterOperand(R7, LSL, 1));  // R7 is Smi.
+  __ add(R7, SP, Operand(R7, LSL, 1));  // R7 is Smi.
   // R7: address of receiver.
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
@@ -1380,7 +1375,7 @@
   const intptr_t count_offset = ICData::CountIndexFor(num_args) * kWordSize;
   __ LoadFromOffset(kWord, R0, R6, target_offset);
   __ LoadFromOffset(kWord, R1, R6, count_offset);
-  __ adds(R1, R1, ShifterOperand(Smi::RawValue(1)));
+  __ adds(R1, R1, Operand(Smi::RawValue(1)));
   __ StoreToOffset(kWord, R1, R6, count_offset);
   __ b(&call_target_function, VC);  // No overflow.
   __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue));
@@ -1397,8 +1392,8 @@
   __ Bind(&get_class_id_as_smi);
 
   // Test if Smi -> load Smi class for comparison.
-  __ tst(R0, ShifterOperand(kSmiTagMask));
-  __ mov(R0, ShifterOperand(Smi::RawValue(kSmiCid)), EQ);
+  __ tst(R0, Operand(kSmiTagMask));
+  __ mov(R0, Operand(Smi::RawValue(kSmiCid)), EQ);
   __ bx(LR, EQ);
   __ LoadClassId(R0, R0);
   __ SmiTag(R0);
@@ -1478,7 +1473,7 @@
     // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
     __ ldr(R6, FieldAddress(R5, ICData::state_bits_offset()));
     ASSERT(ICData::NumArgsTestedShift() == 0);  // No shift needed.
-    __ and_(R6, R6, ShifterOperand(ICData::NumArgsTestedMask()));
+    __ and_(R6, R6, Operand(ICData::NumArgsTestedMask()));
     __ CompareImmediate(R6, 0);
     __ b(&ok, EQ);
     __ Stop("Incorrect IC data for unoptimized static call");
@@ -1512,7 +1507,7 @@
   // Increment count for this call.
   Label increment_done;
   __ LoadFromOffset(kWord, R1, R6, count_offset);
-  __ adds(R1, R1, ShifterOperand(Smi::RawValue(1)));
+  __ adds(R1, R1, Operand(Smi::RawValue(1)));
   __ StoreToOffset(kWord, R1, R6, count_offset);
   __ b(&increment_done, VC);  // No overflow.
   __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue));
@@ -1611,7 +1606,7 @@
         Class::type_arguments_field_offset_in_words_offset()));
     __ CompareImmediate(R5, Class::kNoTypeArguments);
     __ b(&has_no_type_arguments, EQ);
-    __ add(R5, R0, ShifterOperand(R5, LSL, 2));
+    __ add(R5, R0, Operand(R5, LSL, 2));
     __ ldr(R4, FieldAddress(R5, 0));
     __ Bind(&has_no_type_arguments);
   }
@@ -1633,21 +1628,21 @@
   __ ldr(R5, Address(R2, kWordSize * SubtypeTestCache::kInstanceClassId));
   __ CompareImmediate(R5, reinterpret_cast<intptr_t>(Object::null()));
   __ b(&not_found, EQ);
-  __ cmp(R5, ShifterOperand(R3));
+  __ cmp(R5, Operand(R3));
   if (n == 1) {
     __ b(&found, EQ);
   } else {
     __ b(&next_iteration, NE);
     __ ldr(R5,
            Address(R2, kWordSize * SubtypeTestCache::kInstanceTypeArguments));
-    __ cmp(R5, ShifterOperand(R4));
+    __ cmp(R5, Operand(R4));
     if (n == 2) {
       __ b(&found, EQ);
     } else {
       __ b(&next_iteration, NE);
       __ ldr(R5, Address(R2, kWordSize *
                              SubtypeTestCache::kInstantiatorTypeArguments));
-      __ cmp(R5, ShifterOperand(R1));
+      __ cmp(R5, Operand(R1));
       __ b(&found, EQ);
     }
   }
@@ -1700,7 +1695,7 @@
 
 // Return the current stack pointer address, used to do stack alignment checks.
 void StubCode::GenerateGetStackPointerStub(Assembler* assembler) {
-  __ mov(R0, ShifterOperand(SP));
+  __ mov(R0, Operand(SP));
   __ Ret();
 }
 
@@ -1716,12 +1711,12 @@
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == R0);
   ASSERT(kStackTraceObjectReg == R1);
-  __ mov(IP, ShifterOperand(R1));  // Stack pointer.
-  __ mov(LR, ShifterOperand(R0));  // Program counter.
-  __ mov(R0, ShifterOperand(R3));  // Exception object.
+  __ mov(IP, Operand(R1));  // Stack pointer.
+  __ mov(LR, Operand(R0));  // Program counter.
+  __ mov(R0, Operand(R3));  // Exception object.
   __ ldr(R1, Address(SP, 0));  // StackTrace object.
-  __ mov(FP, ShifterOperand(R2));  // Frame_pointer.
-  __ mov(SP, ShifterOperand(IP));  // Stack pointer.
+  __ mov(FP, Operand(R2));  // Frame_pointer.
+  __ mov(SP, Operand(IP));  // Stack pointer.
   __ bx(LR);  // Jump to the exception handler code.
 }
 
@@ -1766,9 +1761,9 @@
                                                     const Register unused) {
   Label reference_compare, done, check_mint, check_bigint;
   // If any of the arguments is Smi do reference compare.
-  __ tst(left, ShifterOperand(kSmiTagMask));
+  __ tst(left, Operand(kSmiTagMask));
   __ b(&reference_compare, EQ);
-  __ tst(right, ShifterOperand(kSmiTagMask));
+  __ tst(right, Operand(kSmiTagMask));
   __ b(&reference_compare, EQ);
 
   // Value compare for two doubles.
@@ -1780,11 +1775,11 @@
   // Double values bitwise compare.
   __ ldr(temp, FieldAddress(left, Double::value_offset() + 0 * kWordSize));
   __ ldr(IP, FieldAddress(right, Double::value_offset() + 0 * kWordSize));
-  __ cmp(temp, ShifterOperand(IP));
+  __ cmp(temp, Operand(IP));
   __ b(&done, NE);
   __ ldr(temp, FieldAddress(left, Double::value_offset() + 1 * kWordSize));
   __ ldr(IP, FieldAddress(right, Double::value_offset() + 1 * kWordSize));
-  __ cmp(temp, ShifterOperand(IP));
+  __ cmp(temp, Operand(IP));
   __ b(&done);
 
   __ Bind(&check_mint);
@@ -1794,11 +1789,11 @@
   __ b(&done, NE);
   __ ldr(temp, FieldAddress(left, Mint::value_offset() + 0 * kWordSize));
   __ ldr(IP, FieldAddress(right, Mint::value_offset() + 0 * kWordSize));
-  __ cmp(temp, ShifterOperand(IP));
+  __ cmp(temp, Operand(IP));
   __ b(&done, NE);
   __ ldr(temp, FieldAddress(left, Mint::value_offset() + 1 * kWordSize));
   __ ldr(IP, FieldAddress(right, Mint::value_offset() + 1 * kWordSize));
-  __ cmp(temp, ShifterOperand(IP));
+  __ cmp(temp, Operand(IP));
   __ b(&done);
 
   __ Bind(&check_bigint);
@@ -1812,11 +1807,11 @@
   __ CallRuntime(kBigintCompareRuntimeEntry, 2);
   // Result in R0, 0 means equal.
   __ LeaveStubFrame();
-  __ cmp(R0, ShifterOperand(0));
+  __ cmp(R0, Operand(0));
   __ b(&done);
 
   __ Bind(&reference_compare);
-  __ cmp(left, ShifterOperand(right));
+  __ cmp(left, Operand(right));
   __ Bind(&done);
 }
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 6a793ac..64d81bf 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -201,8 +201,8 @@
   ASSERT(retval_offset == 3 * kWordSize);
   __ AddImmediate(R3, FP, 2 * kWordSize, kNoPP);
 
-  // TODO(regis): Should we pass the structure by value as in runtime calls?
-  // It would require changing Dart API for native functions.
+  // Passing the structure by value as in runtime calls would require changing
+  // Dart API for native functions.
   // For now, space is reserved on the stack and we pass a pointer to it.
   __ StoreToOffset(R0, SP, isolate_offset, kNoPP);
   __ StoreToOffset(R1, SP, argc_tag_offset, kNoPP);
@@ -225,7 +225,7 @@
   __ LoadImmediate(R2, entry, kNoPP);
   __ blr(R2);
 #else
-  __ BranchLink(&NativeEntry::NativeCallWrapperLabel());
+  __ BranchLink(&NativeEntry::NativeCallWrapperLabel(), kNoPP);
 #endif
   __ b(&done);
 
@@ -322,8 +322,8 @@
   ASSERT(retval_offset == 3 * kWordSize);
   __ AddImmediate(R3, FP, 2 * kWordSize, kNoPP);
 
-  // TODO(regis): Should we pass the structure by value as in runtime calls?
-  // It would require changing Dart API for native functions.
+  // Passing the structure by value as in runtime calls would require changing
+  // Dart API for native functions.
   // For now, space is reserved on the stack and we pass a pointer to it.
   __ StoreToOffset(R0, SP, isolate_offset, kNoPP);
   __ StoreToOffset(R1, SP, argc_tag_offset, kNoPP);
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index d319d2b..37ba59a 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -219,8 +219,8 @@
   ASSERT(retval_offset == 3 * kWordSize);
   __ addiu(A3, FP, Immediate(3 * kWordSize));  // Set retval in NativeArgs.
 
-  // TODO(regis): Should we pass the structure by value as in runtime calls?
-  // It would require changing Dart API for native functions.
+  // Passing the structure by value as in runtime calls would require changing
+  // Dart API for native functions.
   // For now, space is reserved on the stack and we pass a pointer to it.
   __ addiu(SP, SP, Immediate(-4 * kWordSize));
   __ sw(A3, Address(SP, 3 * kWordSize));
@@ -352,8 +352,8 @@
   ASSERT(retval_offset == 3 * kWordSize);
   __ addiu(A3, FP, Immediate(3 * kWordSize));  // Set retval in NativeArgs.
 
-  // TODO(regis): Should we pass the structure by value as in runtime calls?
-  // It would require changing Dart API for native functions.
+  // Passing the structure by value as in runtime calls would require changing
+  // Dart API for native functions.
   // For now, space is reserved on the stack and we pass a pointer to it.
   __ addiu(SP, SP, Immediate(-4 * kWordSize));
   __ sw(A3, Address(SP, 3 * kWordSize));
@@ -545,9 +545,6 @@
       kFirstLocalSlotFromFp + 1 - (kNumberOfCpuRegisters - V0);
   // Result in V0 is preserved as part of pushing all registers below.
 
-  // TODO(regis): Should we align the stack before pushing the fpu registers?
-  // If we do, saved_result_slot_from_fp is not constant anymore.
-
   // Push registers in their enumeration order: lowest register number at
   // lowest address.
   for (int i = 0; i < kNumberOfCpuRegisters; i++) {
diff --git a/runtime/vm/thread_interrupter.cc b/runtime/vm/thread_interrupter.cc
index 632688a..024c161 100644
--- a/runtime/vm/thread_interrupter.cc
+++ b/runtime/vm/thread_interrupter.cc
@@ -9,8 +9,8 @@
 
 // Notes:
 //
-// The ThreadInterrupter interrupts all registered threads once per
-// interrupt period (default is every millisecond). While the thread is
+// The ThreadInterrupter interrupts all threads actively running isolates once
+// per interrupt period (default is 1 millisecond). While the thread is
 // interrupted, the thread's interrupt callback is invoked. Callbacks cannot
 // rely on being executed on the interrupted thread.
 //
@@ -27,8 +27,8 @@
 //   * Allocating memory.
 //   * Taking a lock.
 //
-// The ThreadInterrupter has a single monitor (monitor_). This monitor guards
-// access to the list of threads registered to receive interrupts (threads_).
+// The ThreadInterrupter has a single monitor (monitor_). This monitor is used
+// to synchronize startup, shutdown, and waking up from a deep sleep.
 //
 // A thread can only register and unregister itself. Each thread has a heap
 // allocated ThreadState. A thread's ThreadState is lazily allocated the first
@@ -50,6 +50,7 @@
 ThreadId ThreadInterrupter::interrupter_thread_id_ = Thread::kInvalidThreadId;
 Monitor* ThreadInterrupter::monitor_ = NULL;
 intptr_t ThreadInterrupter::interrupt_period_ = 1000;
+intptr_t ThreadInterrupter::current_wait_time_ = Monitor::kNoTimeout;
 ThreadLocalKey ThreadInterrupter::thread_state_key_ =
     Thread::kUnsetThreadLocalKey;
 
@@ -93,21 +94,31 @@
       return;
     }
     shutdown_ = true;
+    // Notify.
+    monitor_->Notify();
     ASSERT(initialized_);
     if (FLAG_trace_thread_interrupter) {
       OS::Print("ThreadInterrupter shutting down.\n");
     }
+  }
+#if defined(TARGET_OS_WINDOWS)
+  // On Windows, a thread's exit-code can leak into the process's exit-code,
+  // if exiting 'at same time' as the process ends. By joining with the thread
+  // here, we avoid this race condition.
+  ASSERT(interrupter_thread_id_ != Thread::kInvalidThreadId);
+  Thread::Join(interrupter_thread_id_);
+  interrupter_thread_id_ = Thread::kInvalidThreadId;
+#else
+  // On non-Windows platforms, just wait for the thread interrupter to signal
+  // that it has exited the loop.
+  {
+    MonitorLocker shutdown_ml(monitor_);
     while (thread_running_) {
+      // Wait for thread to exit.
       shutdown_ml.Wait();
     }
-    // Join in the interrupter thread. On Windows, a thread's exit-code can
-    // leak into the process's exit-code, if exiting 'at same time' as the
-    // process ends.
-    if (interrupter_thread_id_ != Thread::kInvalidThreadId) {
-      Thread::Join(interrupter_thread_id_);
-      interrupter_thread_id_ = Thread::kInvalidThreadId;
-    }
   }
+#endif
   if (FLAG_trace_thread_interrupter) {
     OS::Print("ThreadInterrupter shut down.\n");
   }
@@ -124,6 +135,19 @@
 }
 
 
+void ThreadInterrupter::WakeUp() {
+  ASSERT(initialized_);
+  {
+    MonitorLocker ml(monitor_);
+    if (!InDeepSleep()) {
+      // No need to notify, regularly waking up.
+      return;
+    }
+    // Notify the interrupter to wake it from its deep sleep.
+    ml.Notify();
+  }
+}
+
 // Register the currently running thread for interrupts. If the current thread
 // is already registered, callback and data will be updated.
 InterruptableThreadState* ThreadInterrupter::Register(
@@ -220,11 +244,25 @@
 
 class ThreadInterrupterVisitIsolates : public IsolateVisitor {
  public:
-  ThreadInterrupterVisitIsolates() { }
+  ThreadInterrupterVisitIsolates() {
+    profiled_thread_count_ = 0;
+  }
+
   void VisitIsolate(Isolate* isolate) {
     ASSERT(isolate != NULL);
-    isolate->ProfileInterrupt();
+    profiled_thread_count_ += isolate->ProfileInterrupt();
   }
+
+  intptr_t profiled_thread_count() const {
+    return profiled_thread_count_;
+  }
+
+  void set_profiled_thread_count(intptr_t profiled_thread_count) {
+    profiled_thread_count_ = profiled_thread_count;
+  }
+
+ private:
+  intptr_t profiled_thread_count_;
 };
 
 
@@ -242,11 +280,32 @@
     startup_ml.Notify();
   }
   {
-    MonitorLocker wait_ml(monitor_);
     ThreadInterrupterVisitIsolates visitor;
+    current_wait_time_ = interrupt_period_;
+    MonitorLocker wait_ml(monitor_);
     while (!shutdown_) {
+      intptr_t r = wait_ml.WaitMicros(current_wait_time_);
+
+      if ((r == Monitor::kNotified) && InDeepSleep()) {
+        // Woken up from deep sleep.
+        ASSERT(visitor.profiled_thread_count() == 0);
+        // Return to regular interrupts.
+        current_wait_time_ = interrupt_period_;
+      }
+
+      // Reset count before visiting isolates.
+      visitor.set_profiled_thread_count(0);
       Isolate::VisitIsolates(&visitor);
-      wait_ml.WaitMicros(interrupt_period_);
+
+      if (visitor.profiled_thread_count() == 0) {
+        // No isolates were profiled. In order to reduce unnecessary CPU
+        // load, we will wait until we are notified before attempting to
+        // interrupt again.
+        current_wait_time_ = Monitor::kNoTimeout;
+        continue;
+      }
+
+      ASSERT(current_wait_time_ != Monitor::kNoTimeout);
     }
   }
   if (FLAG_trace_thread_interrupter) {
diff --git a/runtime/vm/thread_interrupter.h b/runtime/vm/thread_interrupter.h
index 9ee100e..aaa9da4 100644
--- a/runtime/vm/thread_interrupter.h
+++ b/runtime/vm/thread_interrupter.h
@@ -19,10 +19,9 @@
   uintptr_t fp;
 };
 
-// When a thread is interrupted the thread specific interrupt
-// callback will be invoked at the interrupt period. Each callback is given an
-// InterruptedThreadState and the thread specific data pointer. When inside a
-// thread interrupt callback doing any of the following
+// When a thread is interrupted the thread specific interrupt callback will be
+// invoked. Each callback is given an InterruptedThreadState and the user data
+// pointer. When inside a thread interrupt callback doing any of the following
 // is forbidden:
 //   * Accessing TLS.
 //   * Allocating memory.
@@ -48,6 +47,9 @@
   // Delay between interrupts.
   static void SetInterruptPeriod(intptr_t period);
 
+  // Wake up the thread interrupter thread.
+  static void WakeUp();
+
   // Register the currently running thread for interrupts. If the current thread
   // is already registered, callback and data will be updated.
   static InterruptableThreadState* Register(ThreadInterruptCallback callback,
@@ -72,8 +74,13 @@
   static ThreadId interrupter_thread_id_;
   static Monitor* monitor_;
   static intptr_t interrupt_period_;
+  static intptr_t current_wait_time_;
   static ThreadLocalKey thread_state_key_;
 
+  static bool InDeepSleep() {
+    return current_wait_time_ == Monitor::kNoTimeout;
+  }
+
   static InterruptableThreadState* _EnsureThreadStateCreated();
   static void UpdateStateObject(ThreadInterruptCallback callback, void* data);
 
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 1830584..12f36ea 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -198,7 +198,8 @@
 
 
 void CodeGenTest::Compile() {
-  ParsedFunction* parsed_function = new ParsedFunction(function_);
+  ParsedFunction* parsed_function =
+      new ParsedFunction(Isolate::Current(), function_);
   parsed_function->SetNodeSequence(node_sequence_);
   parsed_function->set_instantiator(NULL);
   parsed_function->set_default_parameter_values(default_parameter_values_);
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 98b1926..cfab41b 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -140,6 +140,7 @@
     defined(HOST_ARCH_ARM64)
 // Running on actual ARM or MIPS hardware, execute code natively.
 #define EXECUTE_TEST_CODE_INT32(name, entry) reinterpret_cast<name>(entry)()
+#define EXECUTE_TEST_CODE_INT64(name, entry) reinterpret_cast<name>(entry)()
 #define EXECUTE_TEST_CODE_INT64_LL(name, entry, long_arg0, long_arg1)          \
     reinterpret_cast<name>(entry)(long_arg0, long_arg1)
 #define EXECUTE_TEST_CODE_FLOAT(name, entry) reinterpret_cast<name>(entry)()
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index 292ca9a..1b2a534 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -841,8 +841,6 @@
 
 Native_CanvasRenderingContext2D_textBaseline_Setter(mthis, value) native "CanvasRenderingContext2D_textBaseline_Setter";
 
-Native_CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter(mthis) native "CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter";
-
 Native_CanvasRenderingContext2D_arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_arc_Callback_RESOLVER_STRING_6_float_float_float_float_float_boolean";
 
 Native_CanvasRenderingContext2D_arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "CanvasRenderingContext2D_arcTo_Callback_RESOLVER_STRING_5_float_float_float_float_float";
@@ -7188,10 +7186,10 @@
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
       return Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
       return Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
       return Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -7199,9 +7197,9 @@
 
 Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
 
-Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
+Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
 
-Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
+Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
 
 Native_URL_createObjectUrlFromBlob_Callback(blob) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
 
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 1c84e52..ddb053a 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -47,8 +47,112 @@
   bool isAnalyzed() => resolutionTree != null;
 }
 
+// TODO(johnniwinther): Split this class into interface and implementation.
+// TODO(johnniwinther): Move this implementation to the JS backend.
+class CodegenRegistry extends Registry {
+  final Compiler compiler;
+  final TreeElements treeElements;
+
+  CodegenRegistry(this.compiler, this.treeElements);
+
+  // TODO(johnniwinther): Remove this getter when [Registry] creates a
+  // dependency node.
+  Setlet<Element> get otherDependencies => treeElements.otherDependencies;
+
+  CodegenEnqueuer get world => compiler.enqueuer.codegen;
+  js_backend.JavaScriptBackend get backend => compiler.backend;
+
+  void registerDependency(Element element) {
+    treeElements.registerDependency(element);
+  }
+
+  void registerInstantiatedClass(ClassElement element) {
+    world.registerInstantiatedClass(element, this);
+  }
+
+  void registerInstantiatedType(InterfaceType type) {
+    world.registerInstantiatedType(type, this);
+  }
+
+  void registerStaticUse(Element element) {
+    world.registerStaticUse(element);
+  }
+
+  void registerDynamicInvocation(Selector selector) {
+    world.registerDynamicInvocation(selector);
+  }
+
+  void registerDynamicSetter(Selector selector) {
+    world.registerDynamicSetter(selector);
+  }
+
+  void registerDynamicGetter(Selector selector) {
+    world.registerDynamicGetter(selector);
+  }
+
+  void registerGetterForSuperMethod(Element element) {
+    world.registerGetterForSuperMethod(element);
+  }
+
+  void registerFieldGetter(Element element) {
+    world.registerFieldGetter(element);
+  }
+
+  void registerFieldSetter(Element element) {
+    world.registerFieldSetter(element);
+  }
+
+  void registerIsCheck(DartType type) {
+    world.registerIsCheck(type, this);
+  }
+
+  void registerCompileTimeConstant(Constant constant) {
+    backend.registerCompileTimeConstant(constant, this);
+    backend.constants.addCompileTimeConstantForEmission(constant);
+  }
+
+  void registerTypeVariableBoundsSubtypeCheck(DartType subtype,
+                                              DartType supertype) {
+    backend.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
+  }
+
+  void registerGenericClosure(FunctionElement element) {
+    backend.registerGenericClosure(element, world, this);
+  }
+
+  void registerGetOfStaticFunction(FunctionElement element) {
+    world.registerGetOfStaticFunction(element);
+  }
+
+  void registerSelectorUse(Selector selector) {
+    world.registerSelectorUse(selector);
+  }
+
+  void registerFactoryWithTypeArguments() {
+    world.registerFactoryWithTypeArguments(this);
+  }
+
+  void registerConstSymbol(String name) {
+    world.registerConstSymbol(name, this);
+  }
+
+  void registerSpecializedGetInterceptor(Set<ClassElement> classes) {
+    backend.registerSpecializedGetInterceptor(classes);
+  }
+
+  void registerUseInterceptor() {
+    backend.registerUseInterceptor(world);
+  }
+
+  void registerTypeConstant(ClassElement element) {
+    backend.customElementsAnalysis.registerTypeConstant(element, world);
+  }
+}
+
 /// [WorkItem] used exclusively by the [CodegenEnqueuer].
 class CodegenWorkItem extends WorkItem {
+  Registry registry;
+
   CodegenWorkItem(Element element,
                   ItemCompilationContext compilationContext)
       : super(element, compilationContext);
@@ -59,6 +163,7 @@
         compiler.enqueuer.resolution.getCachedElements(element);
     assert(invariant(element, resolutionTree != null,
         message: 'Resolution tree is null for $element in codegen work item'));
+    registry = new CodegenRegistry(compiler, resolutionTree);
     compiler.codegen(this, world);
   }
 }
@@ -72,6 +177,15 @@
   DeferredTask(this.element, this.action);
 }
 
+/// Interface for registration of element dependencies.
+abstract class Registry {
+  // TODO(johnniwinther): Remove this getter when [Registry] creates a
+  // dependency node.
+  Iterable<Element> get otherDependencies;
+
+  void registerDependency(Element element);
+}
+
 abstract class Backend {
   final Compiler compiler;
 
@@ -95,7 +209,7 @@
 
   void initializeHelperClasses() {}
 
-  void enqueueHelpers(ResolutionEnqueuer world, TreeElements elements);
+  void enqueueHelpers(ResolutionEnqueuer world, Registry registry);
   void codegen(CodegenWorkItem work);
 
   // The backend determines the native resolution enqueuer, with a no-op
@@ -121,57 +235,57 @@
 
 
   /// Called during codegen when [constant] has been used.
-  void registerCompileTimeConstant(Constant constant, TreeElements elements) {}
+  void registerCompileTimeConstant(Constant constant, Registry registry) {}
 
   /// Called during post-processing when [constant] has been evaluated.
-  void registerMetadataConstant(Constant constant, TreeElements elements) {}
+  void registerMetadataConstant(Constant constant, Registry registry) {}
 
   /// Called during resolution to notify to the backend that a class is
   /// being instantiated.
   void registerInstantiatedClass(ClassElement cls,
                                  Enqueuer enqueuer,
-                                 TreeElements elements) {}
+                                 Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program uses string interpolation.
-  void registerStringInterpolation(TreeElements elements) {}
+  void registerStringInterpolation(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program has a catch statement.
   void registerCatchStatement(Enqueuer enqueuer,
-                              TreeElements elements) {}
+                              Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program explicitly throws an exception.
-  void registerThrowExpression(TreeElements elements) {}
+  void registerThrowExpression(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program has a global variable with a lazy initializer.
-  void registerLazyField(TreeElements elements) {}
+  void registerLazyField(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program uses a type variable as an expression.
-  void registerTypeVariableExpression(TreeElements elements) {}
+  void registerTypeVariableExpression(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program uses a type literal.
   void registerTypeLiteral(Element element,
                            Enqueuer enqueuer,
-                           TreeElements elements) {}
+                           Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program has a catch statement with a stack trace.
-  void registerStackTraceInCatch(TreeElements elements) {}
+  void registerStackTraceInCatch(Registry registry) {}
 
   /// Register an is check to the backend.
   void registerIsCheck(DartType type,
                        Enqueuer enqueuer,
-                       TreeElements elements) {}
+                       Registry registry) {}
 
   /// Register an as check to the backend.
   void registerAsCheck(DartType type,
                        Enqueuer enqueuer,
-                       TreeElements elements) {}
+                       Registry registry) {}
 
   /// Register a runtime type variable bound tests between [typeArgument] and
   /// [bound].
@@ -179,27 +293,27 @@
                                               DartType bound) {}
 
   /// Registers that a type variable bounds check might occur at runtime.
-  void registerTypeVariableBoundCheck(TreeElements elements) {}
+  void registerTypeVariableBoundCheck(Registry registry) {}
 
   /// Register that the application may throw a [NoSuchMethodError].
-  void registerThrowNoSuchMethod(TreeElements elements) {}
+  void registerThrowNoSuchMethod(Registry registry) {}
 
   /// Register that the application may throw a [RuntimeError].
-  void registerThrowRuntimeError(TreeElements elements) {}
+  void registerThrowRuntimeError(Registry registry) {}
 
   /// Register that the application may throw an
   /// [AbstractClassInstantiationError].
-  void registerAbstractClassInstantiation(TreeElements elements) {}
+  void registerAbstractClassInstantiation(Registry registry) {}
 
   /// Register that the application may throw a [FallThroughError].
-  void registerFallThroughError(TreeElements elements) {}
+  void registerFallThroughError(Registry registry) {}
 
   /// Register that a super call will end up calling
   /// [: super.noSuchMethod :].
-  void registerSuperNoSuchMethod(TreeElements elements) {}
+  void registerSuperNoSuchMethod(Registry registry) {}
 
   /// Register that the application creates a constant map.
-  void registerConstantMap(TreeElements elements) {}
+  void registerConstantMap(Registry registry) {}
 
   /**
    * Call this to register that an instantiated generic class has a call
@@ -207,18 +321,18 @@
    */
   void registerGenericCallMethod(Element callMethod,
                                  Enqueuer enqueuer,
-                                 TreeElements elements) {}
+                                 Registry registry) {}
   /**
    * Call this to register that a getter exists for a function on an
    * instantiated generic class.
    */
   void registerGenericClosure(Element closure,
                               Enqueuer enqueuer,
-                              TreeElements elements) {}
+                              Registry registry) {}
   /**
    * Call this to register that the [:runtimeType:] property has been accessed.
    */
-  void registerRuntimeType(Enqueuer enqueuer, TreeElements elements) {}
+  void registerRuntimeType(Enqueuer enqueuer, Registry registry) {}
 
   /**
    * Call this method to enable [noSuchMethod] handling in the
@@ -231,10 +345,10 @@
   void registerRequiredType(DartType type, Element enclosingElement) {}
   void registerClassUsingVariableExpression(ClassElement cls) {}
 
-  void registerConstSymbol(String name, TreeElements elements) {}
-  void registerNewSymbol(TreeElements elements) {}
+  void registerConstSymbol(String name, Registry registry) {}
+  void registerNewSymbol(Registry registry) {}
   /// Called when resolving the `Symbol` constructor.
-  void registerSymbolConstructor(TreeElements elements) {}
+  void registerSymbolConstructor(Registry registry) {}
 
   bool isNullImplementation(ClassElement cls) {
     return cls == compiler.nullClass;
@@ -296,6 +410,8 @@
   void onQueueEmpty(Enqueuer enqueuer) {}
 
   /// Called after [element] has been resolved.
+  // TODO(johnniwinther): Change [TreeElements] to [Registry] or a dependency
+  // node. [elements] is currently unused by the implementation.
   void onElementResolved(Element element, TreeElements elements) {}
 }
 
@@ -359,7 +475,9 @@
    * We should get rid of this and ensure that all dependencies are
    * associated with a particular element.
    */
-  final TreeElements globalDependencies = new TreeElementMapping(null);
+  // TODO(johnniwinther): This should not be a [ResolutionRegistry].
+  final ResolutionRegistry globalDependencies =
+      new ResolutionRegistry.internal(null, new TreeElementMapping(null));
 
   /**
    * Dependencies that are only included due to mirrors.
@@ -367,7 +485,9 @@
    * We should get rid of this and ensure that all dependencies are
    * associated with a particular element.
    */
-  final TreeElements mirrorDependencies = new TreeElementMapping(null);
+  // TODO(johnniwinther): This should not be a [ResolutionRegistry].
+  final Registry mirrorDependencies =
+      new ResolutionRegistry.internal(null, new TreeElementMapping(null));
 
   final bool enableMinification;
   final bool enableTypeAssertions;
@@ -1366,11 +1486,6 @@
                               () => resolver.resolveSignature(element));
   }
 
-  void resolveTypedef(TypedefElement element) {
-    withCurrentElement(element,
-                       () => resolver.resolve(element));
-  }
-
   void reportError(Spannable node,
                    MessageKind messageKind,
                    [Map arguments = const {}]) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index 38e5db2..1632c48 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -695,7 +695,7 @@
       if (line == null) exit(0);
       List<String> args = <String>[];
       args.addAll(batchArguments);
-      args.addAll(splitLine(line));
+      args.addAll(splitLine(line, windows: Platform.isWindows));
       return internalMain(args);
     })
     .catchError((exception, trace) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js_profile_many.dart b/sdk/lib/_internal/compiler/implementation/dart2js_profile_many.dart
new file mode 100644
index 0000000..e7ad871
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart2js_profile_many.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 dart2js.profile_many;
+
+import 'dart2js.dart' as cmdline;
+import 'dart:async';
+
+const String USAGE =
+"""
+Usage: dart2js_profile_many.dart [OPTIONS] [FILES]
+
+Invokes dart2js separately for each file using the given options.
+This is for profiling multiple compilations in the Dart Observatory.
+""";
+
+printUsage() {
+  print(USAGE);
+}
+
+void main(List<String> args) {
+
+  List options = [];
+  List files = [];
+
+  for (String arg in args) {
+    if (arg.startsWith('-')) {
+      options.add(arg);
+    } else {
+      files.add(arg);
+    }
+  }
+
+  if (files.length == 0) {
+    printUsage();
+    return;
+  }
+
+  cmdline.exitFunc = (code) {
+    throw "Exit with code $code";
+  };
+
+  Future.forEach(files, (String file) {
+    List subargs = [];
+    subargs.addAll(options);
+    subargs.add(file);
+    return cmdline.compilerMain(subargs).catchError((e) {  });
+  }).then((_) {
+    print("Done");
+  });
+
+
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index bd61e85..1d8b3e4 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -112,7 +112,7 @@
   bool classNeedsRti(ClassElement cls) => false;
   bool methodNeedsRti(FunctionElement function) => false;
 
-  void enqueueHelpers(ResolutionEnqueuer world, TreeElements elements) {
+  void enqueueHelpers(ResolutionEnqueuer world, Registry registry) {
     // Right now resolver doesn't always resolve interfaces needed
     // for literals, so force them. TODO(antonm): fix in the resolver.
     final LITERAL_TYPE_NAMES = const [
@@ -476,7 +476,7 @@
 
   void registerTypeLiteral(Element element,
                            Enqueuer enqueuer,
-                           TreeElements elements) {
+                           Registry registry) {
     if (element.isClass) {
       usedTypeLiterals.add(element);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
index 2026ca8..8738ec6 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
@@ -108,6 +108,49 @@
     return new Parameters(params.map(emitParameter).toList(growable:false));
   }
 
+  /// True if the two expressions are a reference to the same variable.
+  bool isSameVariable(Expression e1, Expression e2) {
+    // TODO(asgerf): Using the annotated element isn't the best way to do this
+    // since elements are supposed to go away from codegen when we discard the
+    // old backend.
+    return e1 is Identifier &&
+           e2 is Identifier &&
+           e1.element is VariableElement &&
+           e1.element == e2.element;
+  }
+
+  Expression makeAssignment(Expression target, Expression value) {
+    // Try to print as compound assignment or increment
+    if (value is BinaryOperator && isCompoundableOperator(value.operator)) {
+      Expression leftOperand = value.left;
+      Expression rightOperand = value.right;
+      bool valid = false;
+      if (isSameVariable(target, leftOperand)) {
+        valid = true;
+      } else if (target is FieldExpression &&
+                 leftOperand is FieldExpression &&
+                 isSameVariable(target.object, leftOperand.object) &&
+                 target.fieldName == leftOperand.fieldName) {
+        valid = true;
+      } else if (target is IndexExpression &&
+                 leftOperand is IndexExpression &&
+                 isSameVariable(target.object, leftOperand.object) &&
+                 isSameVariable(target.index, leftOperand.index)) {
+        valid = true;
+      }
+      if (valid) {
+        if (rightOperand is Literal && rightOperand.value.isOne &&
+            (value.operator == '+' || value.operator == '-')) {
+          return new Increment.prefix(target, value.operator + value.operator);
+        } else {
+          return new Assignment(target, value.operator + '=', rightOperand);
+        }
+      }
+    }
+    // Fall back to regular assignment
+    return new Assignment(target, '=', value);
+  }
+
   void visitExpressionStatement(tree.ExpressionStatement stmt) {
     Expression e = visitExpression(stmt.expression);
     statementBuffer.add(new ExpressionStatement(e));
@@ -145,11 +188,9 @@
       variables.add(new VariableDeclaration(stmt.variable.name)
                             ..element = stmt.variable.element);
     }
-    Expression def = visitExpression(stmt.definition);
-    statementBuffer.add(new ExpressionStatement(new Assignment(
+    statementBuffer.add(new ExpressionStatement(makeAssignment(
         visitVariable(stmt.variable),
-        '=',
-        def)));
+        visitExpression(stmt.definition))));
     visitStatement(stmt.next);
   }
 
@@ -260,15 +301,14 @@
         return new FieldExpression(receiver, exp.selector.name);
 
       case SelectorKind.SETTER:
-        return new Assignment(
+        return makeAssignment(
             new FieldExpression(receiver, exp.selector.name),
-            '=',
             args[0]);
 
       case SelectorKind.INDEX:
         Expression e = new IndexExpression(receiver, args[0]);
         if (args.length == 2) {
-          e = new Assignment(e, '=', args[1]);
+          e = makeAssignment(e, args[1]);
         }
         return e;
 
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
index 50ba9b2..c69bbd4d 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
@@ -474,34 +474,34 @@
 /// This node also represents application of the logical operators && and ||.
 class BinaryOperator extends Expression {
   final Receiver left;
-  final String operatorName;
+  final String operator;
   final Expression right;
 
-  BinaryOperator(this.left, this.operatorName, this.right) {
-    assert(isBinaryOperator(operatorName));
+  BinaryOperator(this.left, this.operator, this.right) {
+    assert(isBinaryOperator(operator));
   }
 }
 
 /// Expression of form `e is T` or `e is! T` or `e as T`.
 class TypeOperator extends Expression {
   final Expression expression;
-  final String operatorName;
+  final String operator;
   final TypeAnnotation type;
 
-  TypeOperator(this.expression, this.operatorName, this.type) {
-    assert(operatorName == 'is'
-        || operatorName == 'as'
-        || operatorName == 'is!');
+  TypeOperator(this.expression, this.operator, this.type) {
+    assert(operator == 'is'
+        || operator == 'as'
+        || operator == 'is!');
   }
 }
 
 class Increment extends Expression {
   final Expression expression;
-  final String operatorName;
+  final String operator;
   final bool isPrefix;
 
-  Increment(this.expression, this.operatorName, this.isPrefix) {
-    assert(operatorName == '++' || operatorName == '--');
+  Increment(this.expression, this.operator, this.isPrefix) {
+    assert(operator == '++' || operator == '--');
     assert(expression.assignable);
   }
 
@@ -518,11 +518,11 @@
                     '+=', '-=', '*=', '/=', '%=', '~/=']);
 
   final Expression left;
-  final String operatorName;
+  final String operator;
   final Expression right;
 
-  Assignment(this.left, this.operatorName, this.right) {
-    assert(_operators.contains(operatorName));
+  Assignment(this.left, this.operator, this.right) {
+    assert(_operators.contains(operator));
     assert(left.assignable);
   }
 }
@@ -548,6 +548,20 @@
 bool isBinaryOperator(String op) {
   return BINARY_PRECEDENCE.containsKey(op);
 }
+/// True if the given operator can be converted to a compound assignment.
+bool isCompoundableOperator(String op) {
+  switch (BINARY_PRECEDENCE[op]) {
+    case BITWISE_OR:
+    case BITWISE_XOR:
+    case BITWISE_AND:
+    case SHIFT:
+    case ADDITIVE:
+    case MULTIPLICATIVE:
+      return true;
+    default:
+      return false;
+  }
+}
 
 
 // Precedence levels
@@ -838,7 +852,7 @@
       Receiver operand = e.operand;
       // !(x == y) ==> x != y.
       if (e.operatorName == '!' &&
-          operand is BinaryOperator && operand.operatorName == '==') {
+          operand is BinaryOperator && operand.operator == '==') {
         withPrecedence(EQUALITY, () {
           writeExp(operand.left, RELATIONAL);
           writeOperator('!=');
@@ -847,7 +861,7 @@
       }
       // !(x is T) ==> x is!T
       else if (e.operatorName == '!' &&
-          operand is TypeOperator && operand.operatorName == 'is') {
+          operand is TypeOperator && operand.operator == 'is') {
         withPrecedence(RELATIONAL, () {
           writeExp(operand.expression, BITWISE_OR, beginStmt: beginStmt);
           write(' is!'); // TODO(asgerf): Minimize use of whitespace.
@@ -861,28 +875,28 @@
         });
       }
     } else if (e is BinaryOperator) {
-      int precedence = BINARY_PRECEDENCE[e.operatorName];
+      int precedence = BINARY_PRECEDENCE[e.operator];
       withPrecedence(precedence, () {
         // All binary operators are left-associative or non-associative.
         // For each operand, we use either the same precedence level as
         // the current operator, or one higher.
         int deltaLeft = isAssociativeBinaryOperator(precedence) ? 0 : 1;
         writeExp(e.left, precedence + deltaLeft, beginStmt: beginStmt);
-        writeOperator(e.operatorName);
+        writeOperator(e.operator);
         writeExp(e.right, precedence + 1);
       });
     } else if (e is TypeOperator) {
       withPrecedence(RELATIONAL, () {
         writeExp(e.expression, BITWISE_OR, beginStmt: beginStmt);
         write(' ');
-        write(e.operatorName);
+        write(e.operator);
         write(' ');
         writeType(e.type);
       });
     } else if (e is Assignment) {
       withPrecedence(EXPRESSION, () {
         writeExp(e.left, PRIMARY, beginStmt: beginStmt);
-        writeOperator(e.operatorName);
+        writeOperator(e.operator);
         writeExp(e.right, EXPRESSION);
       });
     } else if (e is FieldExpression) {
@@ -940,11 +954,11 @@
       int precedence = e.isPrefix ? UNARY : POSTFIX_INCREMENT;
       withPrecedence(precedence, () {
         if (e.isPrefix) {
-          write(e.operatorName);
+          write(e.operator);
           writeExp(e.expression, PRIMARY);
         } else {
           writeExp(e.expression, PRIMARY, beginStmt: beginStmt);
-          write(e.operatorName);
+          write(e.operator);
         }
       });
     } else if (e is Throw) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
index 51eec0e..6f71f08 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
@@ -502,7 +502,7 @@
     if (node.primitive.hasAtLeastOneUse) {
       Variable variable = new Variable(null);
       variables[node.primitive] = variable;
-      return new Assign(variable, definition, node.body.accept(this),
+      return new Assign(variable, definition, visit(node.body),
           node.primitive.hasExactlyOneUse);
     } else if (node.primitive is ir.Constant) {
       // TODO(kmillikin): Implement more systematic treatment of pure CPS
@@ -1402,7 +1402,7 @@
           putInBooleanContext(node.elseExpression));
     }
     // x ? false : y ==> !x && y  (if y is known to be a boolean)
-    if (isBooleanValued(node.elseExpression) && isTrue(node.thenExpression)) {
+    if (isBooleanValued(node.elseExpression) && isFalse(node.thenExpression)) {
       return new LogicalOperator.and(
           makeCondition(node.condition, false, liftNots: false),
           putInBooleanContext(node.elseExpression));
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
index b4069ec..1ae6777 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
@@ -268,18 +268,18 @@
       } else {
         throw "Unexpected left-hand side of assignment: ${left}";
       }
-      tree.Operator op = new tree.Operator(assignmentToken(exp.operatorName));
+      tree.Operator op = new tree.Operator(assignmentToken(exp.operator));
       result = new tree.SendSet(receiver, selector, op, arguments);
       if (left is Identifier) {
         setElement(result, element, exp);
       }
       precedence = EXPRESSION;
     } else if (exp is BinaryOperator) {
-      precedence = BINARY_PRECEDENCE[exp.operatorName];
+      precedence = BINARY_PRECEDENCE[exp.operator];
       int deltaLeft = isAssociativeBinaryOperator(precedence) ? 0 : 1;
       result = new tree.Send(
           makeExp(exp.left, precedence + deltaLeft, beginStmt: beginStmt),
-          new tree.Operator(binopToken(exp.operatorName)),
+          new tree.Operator(binopToken(exp.operator)),
           singleton(makeExp(exp.right, precedence + 1)));
     } else if (exp is CallFunction) {
       precedence = CALLEE;
@@ -384,7 +384,7 @@
       } else {
         throw "Unrecognized left-hand side: ${lvalue}";
       }
-      tree.Operator op = new tree.Operator(incrementToken(exp.operatorName));
+      tree.Operator op = new tree.Operator(incrementToken(exp.operator));
       if (exp.isPrefix) {
         precedence = UNARY;
         result = new tree.SendSet.prefix(receiver, selector, op, argument);
@@ -392,6 +392,9 @@
         precedence = POSTFIX_INCREMENT;
         result = new tree.SendSet.postfix(receiver, selector, op, argument);
       }
+      if (lvalue is Identifier) {
+        setElement(result, lvalue.element, exp);
+      }
     } else if (exp is IndexExpression) {
       precedence = CALLEE;
       result = new tree.Send(
@@ -470,14 +473,14 @@
       precedence = RELATIONAL;
       tree.Operator operator;
       tree.Node rightOperand = makeType(exp.type);
-      if (exp.operatorName == 'is!') {
+      if (exp.operator == 'is!') {
         operator = new tree.Operator(typeOpToken('is'));
         rightOperand = new tree.Send(
             rightOperand,
             new tree.Operator(bang),
             blankList());
       } else {
-        operator = new tree.Operator(typeOpToken(exp.operatorName));
+        operator = new tree.Operator(typeOpToken(exp.operator));
       }
       result = new tree.Send(
           makeExp(exp.expression, BITWISE_OR, beginStmt: beginStmt),
diff --git a/sdk/lib/_internal/compiler/implementation/dart_types.dart b/sdk/lib/_internal/compiler/implementation/dart_types.dart
index 2c30ecb..00851ce6 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_types.dart
@@ -800,8 +800,7 @@
   }
 
   DartType unalias(Compiler compiler) {
-    // TODO(ahe): This should be [ensureResolved].
-    compiler.resolveTypedef(element);
+    element.ensureResolved(compiler);
     element.checkCyclicReference(compiler);
     DartType definition = element.alias.unalias(compiler);
     return definition.substByContext(this);
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 0fb0c59..84b61f4 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -54,7 +54,7 @@
 
 import 'resolution/resolution.dart' show
     TreeElements,
-    AnalyzableElement;
+    AnalyzableElementX;
 
 /// A "hunk" of the program that will be loaded whenever one of its [imports]
 /// are loaded.
@@ -456,7 +456,7 @@
       // TODO(sigurdm): Unresolved elements should just answer false when
       // asked isNeededForReflection. Instead an internal error is triggered.
       // So we have to filter them out here.
-      if (element is AnalyzableElement && !element.hasTreeElements) return;
+      if (element is AnalyzableElementX && !element.hasTreeElements) return;
       if (compiler.backend.isNeededForReflection(element)) {
         _mapDependencies(element, deferredImport);
       }
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 327ccff..e5bf871 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -386,7 +386,9 @@
 
   void diagnose(Element context, DiagnosticListener listener);
 
-  TreeElements get treeElements;
+  // TODO(johnniwinther): Move this to [AstElement].
+  /// Returns the [Element] that holds the [TreeElements] for this element.
+  AnalyzableElement get analyzableElement;
 
   accept(ElementVisitor visitor);
 }
@@ -782,7 +784,8 @@
   int compareTo(CompilationUnitElement other);
 }
 
-abstract class LibraryElement extends Element implements ScopeContainerElement {
+abstract class LibraryElement extends Element
+    implements ScopeContainerElement, AnalyzableElement {
   /**
    * The canonical uri for this library.
    *
@@ -1043,6 +1046,10 @@
   Link<DartType> get typeVariables;
 
   bool get isResolved;
+
+  int get resolutionState;
+
+  void ensureResolved(Compiler compiler);
 }
 
 abstract class ClassElement extends TypeDeclarationElement
@@ -1080,7 +1087,6 @@
   ClassElement get implementation;
 
   int get supertypeLoadState;
-  int get resolutionState;
   String get nativeTagInfo;
 
   bool get isMixinApplication;
@@ -1088,13 +1094,6 @@
   bool get hasBackendMembers;
   bool get hasLocalScopeMembers;
 
-  // TODO(kasperl): These are bit fishy. Do we really need them?
-  void set supertype(DartType value);
-  void set interfaces(Link<DartType> value);
-  void set supertypeLoadState(int value);
-  void set resolutionState(int value);
-  void set nativeTagInfo(String value);
-
   bool isObject(Compiler compiler);
   bool isSubclassOf(ClassElement cls);
   /// Returns true if `this` explicitly/nominally implements [intrface].
@@ -1111,8 +1110,6 @@
   /// Returns `true` if the class hierarchy for this class contains errors.
   bool get hasIncompleteHierarchy;
 
-  void ensureResolved(Compiler compiler);
-
   void addMember(Element element, DiagnosticListener listener);
   void addToScope(Element element, DiagnosticListener listener);
 
@@ -1226,9 +1223,6 @@
   Token get beginToken;
   Token get endToken;
 
-  // TODO(kasperl): Try to get rid of these.
-  void set annotatedElement(Element value);
-
   MetadataAnnotation ensureResolved(Compiler compiler);
 }
 
@@ -1244,10 +1238,17 @@
   FunctionSignature get functionSignature;
 }
 
+/// An [Element] that holds a [TreeElements] mapping.
+abstract class AnalyzableElement extends Element {
+  /// Returns the [TreeElements] that hold the resolution information for the
+  /// AST nodes of this element.
+  TreeElements get treeElements;
+}
+
 /// An [Element] that (potentially) has a node.
 ///
 /// Synthesized elements may return `null` from [node].
-abstract class AstElement extends Element {
+abstract class AstElement extends AnalyzableElement {
   Node get node;
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 03224a3..3770c6f 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -61,7 +61,7 @@
     return null;
   }
 
-  void addMetadata(MetadataAnnotation annotation) {
+  void addMetadata(MetadataAnnotationX annotation) {
     assert(annotation.annotatedElement == null);
     annotation.annotatedElement = this;
     addMetadataInternal(annotation);
@@ -202,6 +202,9 @@
 
   Element get outermostEnclosingMemberOrTopLevel {
     // TODO(lrn): Why is this called "Outermost"?
+    // TODO(johnniwinther): Clean up this method: This method does not return
+    // the outermost for elements in closure classses, but some call-sites rely
+    // on that behavior.
     for (Element e = this; e != null; e = e.enclosingElement) {
       if (e.isMember || e.isTopLevel) {
         return e;
@@ -262,7 +265,9 @@
 
   void diagnose(Element context, DiagnosticListener listener) {}
 
-  TreeElements get treeElements => enclosingElement.treeElements;
+  TreeElements get treeElements => analyzableElement.treeElements;
+
+  AnalyzableElement get analyzableElement => outermostEnclosingMemberOrTopLevel;
 }
 
 /**
@@ -543,7 +548,7 @@
   }
 }
 
-class CompilationUnitElementX extends ElementX with AnalyzableElement
+class CompilationUnitElementX extends ElementX
     implements CompilationUnitElement {
   final Script script;
   PartOf partTag;
@@ -612,6 +617,8 @@
     return '${script.readableUri}'.compareTo('${other.script.readableUri}');
   }
 
+  Element get analyzableElement => library;
+
   accept(ElementVisitor visitor) => visitor.visitCompilationUnitElement(this);
 }
 
@@ -723,7 +730,7 @@
 }
 
 class LibraryElementX
-    extends ElementX with AnalyzableElement, PatchMixin<LibraryElementX>
+    extends ElementX with AnalyzableElementX, PatchMixin<LibraryElementX>
     implements LibraryElement {
   final Uri canonicalUri;
   CompilationUnitElement entryCompilationUnit;
@@ -774,6 +781,8 @@
 
   CompilationUnitElement get compilationUnit => entryCompilationUnit;
 
+  Element get analyzableElement => this;
+
   void addCompilationUnit(CompilationUnitElement element) {
     compilationUnits = compilationUnits.prepend(element);
   }
@@ -1008,7 +1017,7 @@
 }
 
 class TypedefElementX extends ElementX
-    with AnalyzableElement, TypeDeclarationElementX<TypedefType>
+    with AnalyzableElementX, TypeDeclarationElementX<TypedefType>
     implements TypedefElement {
   Typedef cachedNode;
 
@@ -1020,7 +1029,7 @@
   /// [:true:] if the typedef has been checked for cyclic reference.
   bool hasBeenCheckedForCycles = false;
 
-  bool get isResolved => hasTreeElements;
+  int resolutionState = STATE_NOT_STARTED;
 
   TypedefElementX(String name, Element enclosing)
       : super(name, ElementKind.TYPEDEF, enclosing);
@@ -1045,10 +1054,16 @@
     if (thisTypeCache != null) return thisTypeCache;
     Typedef node = parseNode(compiler);
     setThisAndRawTypes(compiler, createTypeVariables(node.typeParameters));
-    compiler.resolveTypedef(this);
+    ensureResolved(compiler);
     return thisTypeCache;
   }
 
+  void ensureResolved(Compiler compiler) {
+    if (resolutionState == STATE_NOT_STARTED) {
+      compiler.resolver.resolve(this);
+    }
+  }
+
   TypedefType createType(Link<DartType> typeArguments) {
     return new TypedefType(this, typeArguments);
   }
@@ -1091,7 +1106,7 @@
   DartType computeType(Element element, Compiler compiler) => type;
 }
 
-class VariableElementX extends ElementX with AnalyzableElement
+class VariableElementX extends ElementX with AnalyzableElementX
     implements VariableElement {
   final Token token;
   final VariableList variables;
@@ -1447,7 +1462,7 @@
 }
 
 abstract class FunctionElementX
-    extends ElementX with AnalyzableElement, PatchMixin<FunctionElement>
+    extends ElementX with AnalyzableElementX, PatchMixin<FunctionElement>
     implements FunctionElement {
   DartType typeCache;
   final Modifiers modifiers;
@@ -1809,10 +1824,12 @@
     }
     return arguments.toLink();
   }
+
+  bool get isResolved => resolutionState == STATE_DONE;
 }
 
 abstract class BaseClassElementX extends ElementX
-    with AnalyzableElement,
+    with AnalyzableElementX,
          TypeDeclarationElementX<InterfaceType>,
          PatchMixin<ClassElement>,
          ClassMemberMixin
@@ -1824,7 +1841,6 @@
   String nativeTagInfo;
   int supertypeLoadState;
   int resolutionState;
-  bool get isResolved => resolutionState == STATE_DONE;
   bool isProxy = false;
   bool hasIncompleteHierarchy = false;
 
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index fabf813..a41bdec 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -107,10 +107,10 @@
    */
   void internalAddToWorkList(Element element);
 
-  void registerInstantiatedType(InterfaceType type, TreeElements elements) {
+  void registerInstantiatedType(InterfaceType type, Registry registry) {
     task.measure(() {
       ClassElement cls = type.element;
-      elements.registerDependency(cls);
+      registry.registerDependency(cls);
       cls.ensureResolved(compiler);
       universe.instantiatedTypes.add(type);
       if (!cls.isAbstract
@@ -125,14 +125,14 @@
     });
   }
 
-  void registerInstantiatedClass(ClassElement cls, TreeElements elements) {
+  void registerInstantiatedClass(ClassElement cls, Registry registry) {
     cls.ensureResolved(compiler);
-    registerInstantiatedType(cls.rawType, elements);
+    registerInstantiatedType(cls.rawType, registry);
   }
 
-  void registerTypeLiteral(Element element, TreeElements elements) {
-    registerInstantiatedClass(compiler.typeClass, elements);
-    compiler.backend.registerTypeLiteral(element, this, elements);
+  void registerTypeLiteral(Element element, Registry registry) {
+    registerInstantiatedClass(compiler.typeClass, registry);
+    compiler.backend.registerTypeLiteral(element, this, registry);
   }
 
   bool checkNoEnqueuedInvokedInstanceMethods() {
@@ -313,11 +313,11 @@
   }
 
   /// Called when [:const Symbol(name):] is seen.
-  void registerConstSymbol(String name, TreeElements elements) {
-    compiler.backend.registerConstSymbol(name, elements);
+  void registerConstSymbol(String name, Registry registry) {
+    compiler.backend.registerConstSymbol(name, registry);
   }
 
-  void pretendElementWasUsed(Element element, TreeElements elements) {
+  void pretendElementWasUsed(Element element, Registry registry) {
     if (!compiler.backend.isNeededForReflection(element)) return;
     if (Elements.isUnresolved(element)) {
       // Ignore.
@@ -326,11 +326,11 @@
       // TODO(ahe): Work-around for http://dartbug.com/11205.
     } else if (element.isConstructor) {
       ClassElement cls = element.declaration.enclosingClass;
-      registerInstantiatedType(cls.rawType, elements);
+      registerInstantiatedType(cls.rawType, registry);
       registerStaticUse(element.declaration);
     } else if (element.isClass) {
       ClassElement cls = element.declaration;
-      registerInstantiatedClass(cls, elements);
+      registerInstantiatedClass(cls, registry);
       // Make sure that even abstract classes are considered instantiated.
       universe.instantiatedClasses.add(cls);
     } else if (element.impliesType) {
@@ -349,8 +349,8 @@
   }
 
   /// Called when [:new Symbol(...):] is seen.
-  void registerNewSymbol(TreeElements elements) {
-    compiler.backend.registerNewSymbol(elements);
+  void registerNewSymbol(Registry registry) {
+    compiler.backend.registerNewSymbol(registry);
   }
 
   void enqueueEverything() {
@@ -495,14 +495,14 @@
     universe.fieldSetters.add(element);
   }
 
-  void registerIsCheck(DartType type, TreeElements elements) {
+  void registerIsCheck(DartType type, Registry registry) {
     type = universe.registerIsCheck(type, compiler);
     // Even in checked mode, type annotations for return type and argument
     // types do not imply type checks, so there should never be a check
     // against the type variable of a typedef.
     assert(type.kind != TypeKind.TYPE_VARIABLE ||
            !type.element.enclosingElement.isTypedef);
-    compiler.backend.registerIsCheck(type, this, elements);
+    compiler.backend.registerIsCheck(type, this, registry);
   }
 
   /**
@@ -510,17 +510,17 @@
    * which arguments could be used to create instances of classes that use their
    * type variables as expressions, so we have to remember if we saw such a use.
    */
-  void registerFactoryWithTypeArguments(TreeElements elements) {
+  void registerFactoryWithTypeArguments(Registry registry) {
     universe.usingFactoryWithTypeArguments = true;
   }
 
-  void registerAsCheck(DartType type, TreeElements elements) {
-    registerIsCheck(type, elements);
-    compiler.backend.registerAsCheck(type, this, elements);
+  void registerAsCheck(DartType type, Registry registry) {
+    registerIsCheck(type, registry);
+    compiler.backend.registerAsCheck(type, this, registry);
   }
 
-  void registerGenericCallMethod(Element element, TreeElements elements) {
-    compiler.backend.registerGenericCallMethod(element, this, elements);
+  void registerGenericCallMethod(Element element, Registry registry) {
+    compiler.backend.registerGenericCallMethod(element, this, registry);
     universe.genericCallMethods.add(element);
   }
 
@@ -530,23 +530,23 @@
                               compiler.globalDependencies);
   }
 
-  void registerClosurizedMember(Element element, TreeElements elements) {
+  void registerClosurizedMember(Element element, Registry registry) {
     assert(element.isInstanceMember);
-    registerIfGeneric(element, elements);
+    registerIfGeneric(element, registry);
     registerBoundClosure();
     universe.closurizedMembers.add(element);
   }
 
 
-  void registerIfGeneric(Element element, TreeElements elements) {
+  void registerIfGeneric(Element element, Registry registry) {
     if (element.computeType(compiler).containsTypeVariables) {
-      compiler.backend.registerGenericClosure(element, this, elements);
+      compiler.backend.registerGenericClosure(element, this, registry);
       universe.genericClosures.add(element);
     }
   }
 
-  void registerClosure(Element element, TreeElements elements) {
-    registerIfGeneric(element, elements);
+  void registerClosure(Element element, Registry registry) {
+    registerIfGeneric(element, registry);
   }
 
   void forEach(f(WorkItem work)) {
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
index bbd3ed92..c2c518c 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
@@ -492,63 +492,64 @@
    * exit of the switch, because there is no default case. So the
    * types of locals at entry of the switch have to take part to the
    * merge.
+   *
+   * The above situation is also true for labeled statements like
+   *
+   * [: L: {
+   *      if (...) break;
+   *      ...
+   *    }
+   * :]
+   *
+   * where [:this:] is the [LocalsHandler] for the paths through the
+   * labeled statement that do not break out.
    */
   void mergeAfterBreaks(List<LocalsHandler<T>> handlers,
                         {bool keepOwnLocals: true}) {
     Node level = locals.block;
-    LocalsHandler<T> startWith;
-    int index = 0;
+    Set<Element> seenLocals = new Setlet<Element>();
+    // If we want to keep the locals, we first merge [this] into itself to
+    // create the required Phi nodes.
     if (keepOwnLocals && !seenReturnOrThrow) {
-      startWith = this;
-      index--;
-    } else {
-      // Find the first handler that does not abort.
-      while (index < handlers.length
-             && (startWith = handlers[index]).seenReturnOrThrow) {
-        index++;
-      }
-      if (index == handlers.length) {
-        // If we haven't found a handler that does not abort, we know
-        // this handler aborts.
-        seenReturnOrThrow = true;
-        return;
-      } else {
-        // Otherwise, this handler does not abort.
-        seenReturnOrThrow = false;
-      }
+      mergeHandler(this, seenLocals);
     }
-    // Use [startWith] to initialize the types of locals.
-    locals.forEachLocal((local, myType) {
-      T otherType = startWith.locals[local];
-      T newType = types.allocatePhi(level, local, otherType);
-      if (myType != newType) {
-        locals[local] = newType;
-      }
-    });
+    bool allBranchesAbort = true;
     // Merge all other handlers.
-    for (int i = index + 1; i < handlers.length; i++) {
-      mergeHandler(handlers[i]);
+    for (LocalsHandler handler in handlers) {
+      allBranchesAbort = allBranchesAbort && handler.seenReturnOrThrow;
+      mergeHandler(handler, seenLocals);
     }
-
+    // Clean up Phi nodes with single input.
     locals.forEachLocal((Element element, T type) {
+      if (!seenLocals.contains(element)) return;
       T newType = types.simplifyPhi(level, element, type);
       if (newType != type) {
         locals[element] = newType;
       }
     });
+    seenReturnOrThrow = allBranchesAbort &&
+                        (!keepOwnLocals || seenReturnOrThrow);
   }
 
   /**
    * Merge [other] into this handler. Returns whether a local in this
-   * has changed.
+   * has changed. If [seen] is not null, we allocate new Phi nodes
+   * unless the local is already present in the set [seen]. This effectively
+   * overwrites the current type knowledge in this handler.
    */
-  bool mergeHandler(LocalsHandler<T> other) {
+  bool mergeHandler(LocalsHandler<T> other, [Set<Element> seen]) {
     if (other.seenReturnOrThrow) return false;
     bool changed = false;
     other.locals.forEachLocalUntilNode(locals.block, (local, otherType) {
       T myType = locals[local];
       if (myType == null) return;
-      T newType = types.addPhiInput(local, myType, otherType);
+      T newType;
+      if (seen != null && !seen.contains(local)) {
+        newType = types.allocatePhi(locals.block, local, otherType);
+        seen.add(local);
+      } else {
+        newType = types.addPhiInput(local, myType, otherType);
+      }
       if (newType != myType) {
         changed = true;
         locals[local] = newType;
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index 0152fe2..984df98 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -306,14 +306,17 @@
     return null;
   }
 
+  /// Create branch join continuation parameters and fill in arguments.
+  ///
   /// Given delimited builders for the arms of a branch, return a list of
   /// fresh join-point continuation parameters for the join continuation.
   /// Fill in [leftArguments] and [rightArguments] with the left and right
   /// continuation invocation arguments.
-  List<ir.Parameter> createJoinParameters(IrBuilder leftBuilder,
-                                          List<ir.Primitive> leftArguments,
-                                          IrBuilder rightBuilder,
-                                          List<ir.Primitive> rightArguments) {
+  List<ir.Parameter> createBranchJoinParametersAndFillArguments(
+      IrBuilder leftBuilder,
+      IrBuilder rightBuilder,
+      List<ir.Primitive> leftArguments,
+      List<ir.Primitive> rightArguments) {
     // The sets of free and assigned variables for a delimited builder is
     // initially the length of the assigned variables of the parent.  The free
     // variables cannot grow because there cannot be free occurrences of
@@ -321,8 +324,8 @@
     // subgraph.  The assigned variables can grow when new variables are
     // declared in the delimited graph, but we only inspect the prefix
     // corresponding to the parent's declared variables.
-    assert(assignedVars.length == leftBuilder.freeVars.length);
-    assert(assignedVars.length == rightBuilder.freeVars.length);
+    assert(leftBuilder.isOpen);
+    assert(rightBuilder.isOpen);
     assert(assignedVars.length <= leftBuilder.assignedVars.length);
     assert(assignedVars.length <= rightBuilder.assignedVars.length);
 
@@ -333,10 +336,8 @@
     // argument to the join point continuation.
     for (int i = 0; i < assignedVars.length; ++i) {
       // The last assignments, if any, reaching the end of the two subterms.
-      ir.Definition leftAssignment =
-          leftBuilder.isOpen ? leftBuilder.assignedVars[i] : null;
-      ir.Definition rightAssignment =
-          rightBuilder.isOpen ? rightBuilder.assignedVars[i] : null;
+      ir.Primitive leftAssignment = leftBuilder.assignedVars[i];
+      ir.Primitive rightAssignment = rightBuilder.assignedVars[i];
 
       if (leftAssignment != null || rightAssignment != null) {
         // The corresponsing argument is the reaching definition if any, or a
@@ -345,12 +346,12 @@
         // possibly arguments passed to it.  Such singly-used continuations
         // are eliminated by the shrinking conversions.
         parameters.add(new ir.Parameter(null));
-        leftArguments.add(leftAssignment == null
-                              ? leftBuilder.freeVars[i]
-                              : leftAssignment);
-        rightArguments.add(rightAssignment == null
-                              ? rightBuilder.freeVars[i]
-                              : rightAssignment);
+        ir.Primitive reachingDefinition =
+            assignedVars[i] == null ? freeVars[i] : assignedVars[i];
+        leftArguments.add(
+            leftAssignment == null ? reachingDefinition : leftAssignment);
+        rightArguments.add(
+            rightAssignment == null ? reachingDefinition : rightAssignment);
       }
     }
     return parameters;
@@ -403,14 +404,25 @@
     return parameters;
   }
 
-  void captureFreeVariables(IrBuilder leftBuilder,
-                            IrBuilder rightBuilder,
-                            List<ir.Parameter> parameters) {
+  /// Capture free variables in the arms of a branch.
+  ///
+  /// Capture the free variables in the left and right arms of a conditional
+  /// branch.  The free variables are captured by the current definition.
+  /// Also update the builder's assigned variables to be those reaching the
+  /// branch join.  If there is no join, [parameters] should be `null` and
+  /// at least one of [leftBuilder] or [rightBuilder] should not be open.
+  void captureFreeBranchVariables(IrBuilder leftBuilder,
+                                  IrBuilder rightBuilder,
+                                  List<ir.Parameter> parameters) {
+    // Parameters is non-null when there is a join, if and only if both left
+    // and right subterm contexts are open.
+    assert((leftBuilder.isOpen && rightBuilder.isOpen) ==
+           (parameters != null));
     int parameterIndex = 0;
     for (int i = 0; i < assignedVars.length; ++i) {
       // This is the definition that reaches the left and right subterms.  All
       // free uses in either term are uses of this definition.
-      ir.Definition reachingDefinition =
+      ir.Primitive reachingDefinition =
           assignedVars[i] == null ? freeVars[i] : assignedVars[i];
       reachingDefinition
           ..substituteFor(leftBuilder.freeVars[i])
@@ -419,9 +431,16 @@
       // Also add join continuation parameters as assignments for the join
       // body.  This is done last because the assigned variables are updated
       // in place.
-      if ((leftBuilder.isOpen && leftBuilder.assignedVars[i] != null) ||
-          (rightBuilder.isOpen && rightBuilder.assignedVars[i] != null)) {
-        assignedVars[i] = parameters[parameterIndex++];
+      ir.Primitive leftAssignment = leftBuilder.assignedVars[i];
+      ir.Primitive rightAssignment = rightBuilder.assignedVars[i];
+      if (parameters != null) {
+        if (leftAssignment != null || rightAssignment != null) {
+          assignedVars[i] = parameters[parameterIndex++];
+        }
+      } else if (leftBuilder.isOpen) {
+        if (leftAssignment != null) assignedVars[i] = leftAssignment;
+      } else if (rightBuilder.isOpen) {
+        if (rightAssignment != null) assignedVars[i] = rightAssignment;
       }
     }
   }
@@ -475,54 +494,66 @@
     thenBuilder.visit(node.thenPart);
     if (node.hasElsePart) elseBuilder.visit(node.elsePart);
 
-    // The free variables in the then and else parts are uses of definitions
-    // from an outer builder.  Capture them or propagate them outward.  The
-    // assigned variables in the then and else parts are arguments to the join
-    // point continuation if any.
-
-    List<ir.Primitive> thenArguments = <ir.Primitive>[];
-    List<ir.Primitive> elseArguments = <ir.Primitive>[];
-    List<ir.Parameter> parameters =
-        createJoinParameters(thenBuilder, thenArguments,
-                             elseBuilder, elseArguments);
-
-    // Create a then and else continuations and a join continuation if
-    // necessary.  Jump to the join continuation from the exits of the then
-    // and else continuations.
-    ir.Continuation joinContinuation;
+    // Build the term
+    // (Result =) let cont then() = [[thenPart]] in
+    //            let cont else() = [[elsePart]] in
+    //              if condition (then, else)
     ir.Continuation thenContinuation = new ir.Continuation([]);
     ir.Continuation elseContinuation = new ir.Continuation([]);
-    if (thenBuilder.isOpen || elseBuilder.isOpen) {
-      joinContinuation = new ir.Continuation(parameters);
-      if (thenBuilder.isOpen) {
-        thenBuilder.add(
-            new ir.InvokeContinuation(joinContinuation, thenArguments));
-      }
-      if (elseBuilder.isOpen) {
-        elseBuilder.add(
-            new ir.InvokeContinuation(joinContinuation, elseArguments));
-      }
+    ir.Expression letElse =
+        new ir.LetCont(elseContinuation,
+                       new ir.Branch(new ir.IsTrue(condition),
+                                     thenContinuation,
+                                     elseContinuation));
+    ir.Expression letThen = new ir.LetCont(thenContinuation, letElse);
+    ir.Expression result = letThen;
+
+    List<ir.Parameter> parameters;  // Null if there is no join.
+    if (thenBuilder.isOpen && elseBuilder.isOpen) {
+      // There is a join-point continuation.  Build the term
+      // 'let cont join(x, ...) = [] in Result' and plug invocations of the
+      // join-point continuation into the then and else continuations.
+      List<ir.Primitive> thenArguments = <ir.Primitive>[];
+      List<ir.Primitive> elseArguments = <ir.Primitive>[];
+
+      // Compute the join-point continuation parameters.  Fill in the
+      // arguments to the join-point continuation invocations.
+      parameters = createBranchJoinParametersAndFillArguments(
+          thenBuilder, elseBuilder, thenArguments, elseArguments);
+      ir.Continuation joinContinuation = new ir.Continuation(parameters);
+      thenBuilder.add(
+          new ir.InvokeContinuation(joinContinuation, thenArguments));
+      elseBuilder.add(
+          new ir.InvokeContinuation(joinContinuation, elseArguments));
+      result = new ir.LetCont(joinContinuation, result);
     }
+
+    // Capture free occurrences in the then and else bodies and update the
+    // assigned variables for the successor.  This is done after creating
+    // invocations of the join continuation so free join continuation
+    // arguments are properly captured.
+    captureFreeBranchVariables(thenBuilder, elseBuilder, parameters);
+
+    // The then or else term root could be null, but not both.  If there is
+    // a join then an InvokeContinuation was just added to both of them.  If
+    // there is no join, then at least one of them is closed and thus has a
+    // non-null root by the definition of the predicate isClosed.  In the
+    // case that one of them is null, it must be the only one that is open
+    // and thus contains the new hole in the context.  This case is handled
+    // after the branch is plugged into the current hole.
     thenContinuation.body = thenBuilder.root;
     elseContinuation.body = elseBuilder.root;
 
-    // Capture free occurrences in the then and else bodies and add join
-    // continuation parameters as assignments reaching the join body.  This is
-    // done after creating invocations of the join continuation so free join
-    // continuation arguments are properly captured.
-    captureFreeVariables(thenBuilder, elseBuilder, parameters);
-
-    ir.Expression branch =
-        new ir.LetCont(thenContinuation,
-            new ir.LetCont(elseContinuation,
-                new ir.Branch(new ir.IsTrue(condition),
-                              thenContinuation,
-                              elseContinuation)));
-    if (joinContinuation == null) {
-      add(branch);
-      current = null;
-    } else {
-      add(new ir.LetCont(joinContinuation, branch));
+    add(result);
+    if (parameters == null) {
+      // At least one subter is closed.
+      if (thenBuilder.isOpen) {
+        current = (thenBuilder.root == null) ? letThen : thenBuilder.current;
+      } else if (elseBuilder.isOpen) {
+        current = (elseBuilder.root == null) ? letElse : elseBuilder.current;
+      } else {
+        current = null;
+      }
     }
     return null;
   }
@@ -533,8 +564,8 @@
     // the loop exit (break), and the loop back edge (continue).
     // The CPS translation [[while (condition) body; successor]] is:
     //
-    // let cont break() = [[successor]] in
     // let cont continue(x, ...) =
+    //     let cont break() = [[successor]] in
     //     let cont body() = [[body]]; continue(v, ...) in
     //     let prim cond = [[condition]] in
     //     branch cond (body, break) in
@@ -562,8 +593,6 @@
           createLoopJoinParametersAndFillArguments(entryArguments, condBuilder,
                                    bodyBuilder, loopArguments);
       continueContinuation = new ir.Continuation(parameters);
-      continueContinuation.body =
-          new ir.LetCont(bodyContinuation, condBuilder.root);
       bodyBuilder.add(
           new ir.InvokeContinuation(continueContinuation, loopArguments,
                                     recursive:true));
@@ -573,15 +602,18 @@
     // Capture free variable occurrences in the loop body.
     captureFreeLoopVariables(condBuilder, bodyBuilder, parameters);
 
+    ir.Expression resultContext =
+        new ir.LetCont(breakContinuation,
+            new ir.LetCont(bodyContinuation,
+                condBuilder.root));
     if (continueContinuation != null) {
-      add(new ir.LetCont(breakContinuation,
-              new ir.LetCont(continueContinuation,
-                  new ir.InvokeContinuation(continueContinuation,
-                                            entryArguments))));
+      continueContinuation.body = resultContext;
+      add(new ir.LetCont(continueContinuation,
+            new ir.InvokeContinuation(continueContinuation,
+              entryArguments)));
+      current = resultContext;
     } else {
-      add(new ir.LetCont(breakContinuation,
-              new ir.LetCont(bodyContinuation,
-                  condBuilder.root)));
+      add(resultContext);
     }
     return null;
   }
@@ -642,17 +674,24 @@
     ir.Primitive thenValue = thenBuilder.visit(node.thenExpression);
     ir.Primitive elseValue = elseBuilder.visit(node.elseExpression);
 
+    // Compute the join-point continuation parameters.  Fill in the
+    // arguments to the join-point continuation invocations.
     List<ir.Primitive> thenArguments = <ir.Primitive>[];
     List<ir.Primitive> elseArguments = <ir.Primitive>[];
     List<ir.Parameter> parameters =
-        createJoinParameters(thenBuilder, thenArguments,
-                             elseBuilder, elseArguments);
+        createBranchJoinParametersAndFillArguments(
+            thenBuilder, elseBuilder, thenArguments, elseArguments);
     // Add a continuation parameter for the result of the expression.
     ir.Parameter resultParameter = new ir.Parameter(null);
     parameters.add(resultParameter);
     thenArguments.add(thenValue);
     elseArguments.add(elseValue);
 
+    // Build the term
+    //   let cont join(x, ..., result) = [] in
+    //   let cont then() = [[thenPart]]; join(v, ...) in
+    //   let cont else() = [[elsePart]]; join(v, ...) in
+    //     if condition (then, else)
     ir.Continuation joinContinuation = new ir.Continuation(parameters);
     ir.Continuation thenContinuation = new ir.Continuation([]);
     ir.Continuation elseContinuation = new ir.Continuation([]);
@@ -660,18 +699,21 @@
         new ir.InvokeContinuation(joinContinuation, thenArguments));
     elseBuilder.add(
         new ir.InvokeContinuation(joinContinuation, elseArguments));
+
+    // Capture free occurrences in the then and else bodies and update the
+    // assigned variables for the successor.  This is done after creating
+    // invocations of the join continuation so free join continuation
+    // arguments are properly captured.
+    captureFreeBranchVariables(thenBuilder, elseBuilder, parameters);
+
     thenContinuation.body = thenBuilder.root;
     elseContinuation.body = elseBuilder.root;
-
-    captureFreeVariables(thenBuilder, elseBuilder, parameters);
-
-    ir.Expression branch =
-        new ir.LetCont(thenContinuation,
-            new ir.LetCont(elseContinuation,
-                new ir.Branch(new ir.IsTrue(condition),
-                              thenContinuation,
-                              elseContinuation)));
-    add(new ir.LetCont(joinContinuation, branch));
+    add(new ir.LetCont(joinContinuation,
+            new ir.LetCont(thenContinuation,
+                new ir.LetCont(elseContinuation,
+                    new ir.Branch(new ir.IsTrue(condition),
+                                  thenContinuation,
+                                  elseContinuation)))));
     return resultParameter;
   }
 
@@ -906,8 +948,8 @@
     List <ir.Primitive> leftArguments = <ir.Primitive>[];
     List <ir.Primitive> rightArguments = <ir.Primitive>[];
     List <ir.Parameter> parameters =
-        createJoinParameters(emptyBuilder, leftArguments,
-                             rightBuilder, rightArguments);
+        createBranchJoinParametersAndFillArguments(
+            emptyBuilder, rightBuilder, leftArguments, rightArguments);
 
     // Add a continuation parameter for the result of the expression.
     ir.Parameter resultParameter = new ir.Parameter(null);
@@ -962,7 +1004,7 @@
     // Capture free local variable occurrences in the right subexpression
     // and update the reaching definitions for the join-point continuation
     // body to include the continuation's parameters.
-    captureFreeVariables(rightBuilder, emptyBuilder, parameters);
+    captureFreeBranchVariables(rightBuilder, emptyBuilder, parameters);
 
     add(new ir.LetCont(joinContinuation,
             new ir.LetCont(leftTrueContinuation,
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 4f1af2b..717366b 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -621,7 +621,7 @@
 
   void addInterceptors(ClassElement cls,
                        Enqueuer enqueuer,
-                       TreeElements elements) {
+                       Registry registry) {
     if (enqueuer.isResolutionQueue) {
       _interceptedClasses.add(jsInterceptorClass);
       _interceptedClasses.add(cls);
@@ -635,7 +635,7 @@
         },
         includeSuperAndInjectedMembers: true);
     }
-    enqueueClass(enqueuer, cls, elements);
+    enqueueClass(enqueuer, cls, registry);
   }
 
   Set<ClassElement> get interceptedClasses {
@@ -654,17 +654,17 @@
     }
   }
 
-  void registerCompileTimeConstant(Constant constant, TreeElements elements) {
-    registerCompileTimeConstantInternal(constant, elements);
+  void registerCompileTimeConstant(Constant constant, Registry registry) {
+    registerCompileTimeConstantInternal(constant, registry);
     for (Constant dependency in constant.getDependencies()) {
-      registerCompileTimeConstant(dependency, elements);
+      registerCompileTimeConstant(dependency, registry);
     }
   }
 
   void registerCompileTimeConstantInternal(Constant constant,
-                                           TreeElements elements) {
+                                           Registry registry) {
     DartType type = constant.computeType(compiler);
-    registerInstantiatedConstantType(type, elements);
+    registerInstantiatedConstantType(type, registry);
 
     if (constant.isFunction) {
       FunctionConstant function = constant;
@@ -672,19 +672,19 @@
     } else if (constant.isInterceptor) {
       // An interceptor constant references the class's prototype chain.
       InterceptorConstant interceptor = constant;
-      registerInstantiatedConstantType(interceptor.dispatchedType, elements);
+      registerInstantiatedConstantType(interceptor.dispatchedType, registry);
     } else if (constant.isType) {
       TypeConstant typeConstant = constant;
       registerTypeLiteral(typeConstant.representedType.element,
-          compiler.enqueuer.codegen, elements);
+          compiler.enqueuer.codegen, registry);
     }
   }
 
-  void registerInstantiatedConstantType(DartType type, TreeElements elements) {
+  void registerInstantiatedConstantType(DartType type, Registry registry) {
     Enqueuer enqueuer = compiler.enqueuer.codegen;
     DartType instantiatedType =
         type.kind == TypeKind.FUNCTION ? compiler.functionClass.rawType : type;
-    enqueuer.registerInstantiatedType(instantiatedType, elements);
+    enqueuer.registerInstantiatedType(instantiatedType, registry);
     if (type is InterfaceType && !type.treatAsRaw &&
         classNeedsRti(type.element)) {
       enqueuer.registerStaticUse(getSetRuntimeTypeInfo());
@@ -697,17 +697,17 @@
     }
   }
 
-  void registerMetadataConstant(Constant constant, TreeElements elements) {
+  void registerMetadataConstant(Constant constant, Registry registry) {
     if (mustRetainMetadata) {
-      registerCompileTimeConstant(constant, elements);
+      registerCompileTimeConstant(constant, registry);
     } else {
-      metadataConstants.add(new Dependency(constant, elements));
+      metadataConstants.add(new Dependency(constant, registry));
     }
   }
 
   void registerInstantiatedClass(ClassElement cls,
                                  Enqueuer enqueuer,
-                                 TreeElements elements) {
+                                 Registry registry) {
     if (!cls.typeVariables.isEmpty) {
       typeVariableHandler.registerClassWithTypeVariables(cls);
     }
@@ -721,35 +721,35 @@
         // `iae` helper directly.
         enqueue(enqueuer,
                 compiler.findHelper('iae'),
-                elements);
+                registry);
       } else if (cls == compiler.listClass
                  || cls == compiler.stringClass) {
         // The backend will try to optimize array and string access and use the
         // `ioore` and `iae` helpers directly.
         enqueue(enqueuer,
                 compiler.findHelper('ioore'),
-                elements);
+                registry);
         enqueue(enqueuer,
                 compiler.findHelper('iae'),
-                elements);
+                registry);
       } else if (cls == compiler.functionClass) {
-        enqueueClass(enqueuer, compiler.closureClass, elements);
+        enqueueClass(enqueuer, compiler.closureClass, registry);
       } else if (cls == compiler.mapClass) {
         // The backend will use a literal list to initialize the entries
         // of the map.
-        enqueueClass(enqueuer, compiler.listClass, elements);
-        enqueueClass(enqueuer, mapLiteralClass, elements);
+        enqueueClass(enqueuer, compiler.listClass, registry);
+        enqueueClass(enqueuer, mapLiteralClass, registry);
         // For map literals, the dependency between the implementation class
         // and [Map] is not visible, so we have to add it manually.
         rti.registerRtiDependency(mapLiteralClass, cls);
       } else if (cls == compiler.boundClosureClass) {
         // TODO(ngeoffray): Move the bound closure class in the
         // backend.
-        enqueueClass(enqueuer, compiler.boundClosureClass, elements);
+        enqueueClass(enqueuer, compiler.boundClosureClass, registry);
       } else if (Elements.isNativeOrExtendsNative(cls)) {
-        enqueue(enqueuer, getNativeInterceptorMethod, elements);
+        enqueue(enqueuer, getNativeInterceptorMethod, registry);
         enqueueClass(enqueuer, jsInterceptorClass, compiler.globalDependencies);
-        enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, elements);
+        enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, registry);
       } else if (cls == mapLiteralClass) {
         // For map literals, the dependency between the implementation class
         // and [Map] is not visible, so we have to add it manually.
@@ -769,50 +769,50 @@
         }
         mapLiteralConstructor = getFactory('_literal', 1);
         mapLiteralConstructorEmpty = getFactory('_empty', 0);
-        enqueueInResolution(mapLiteralConstructor, elements);
-        enqueueInResolution(mapLiteralConstructorEmpty, elements);
+        enqueueInResolution(mapLiteralConstructor, registry);
+        enqueueInResolution(mapLiteralConstructorEmpty, registry);
       }
     }
     if (cls == compiler.closureClass) {
       enqueue(enqueuer,
               compiler.findHelper('closureFromTearOff'),
-              elements);
+              registry);
     }
     ClassElement result = null;
     if (cls == compiler.stringClass || cls == jsStringClass) {
-      addInterceptors(jsStringClass, enqueuer, elements);
+      addInterceptors(jsStringClass, enqueuer, registry);
     } else if (cls == compiler.listClass
                || cls == jsArrayClass
                || cls == jsFixedArrayClass
                || cls == jsExtendableArrayClass) {
-      addInterceptors(jsArrayClass, enqueuer, elements);
-      addInterceptors(jsMutableArrayClass, enqueuer, elements);
-      addInterceptors(jsFixedArrayClass, enqueuer, elements);
-      addInterceptors(jsExtendableArrayClass, enqueuer, elements);
+      addInterceptors(jsArrayClass, enqueuer, registry);
+      addInterceptors(jsMutableArrayClass, enqueuer, registry);
+      addInterceptors(jsFixedArrayClass, enqueuer, registry);
+      addInterceptors(jsExtendableArrayClass, enqueuer, registry);
     } else if (cls == compiler.intClass || cls == jsIntClass) {
-      addInterceptors(jsIntClass, enqueuer, elements);
-      addInterceptors(jsPositiveIntClass, enqueuer, elements);
-      addInterceptors(jsUInt32Class, enqueuer, elements);
-      addInterceptors(jsUInt31Class, enqueuer, elements);
-      addInterceptors(jsNumberClass, enqueuer, elements);
+      addInterceptors(jsIntClass, enqueuer, registry);
+      addInterceptors(jsPositiveIntClass, enqueuer, registry);
+      addInterceptors(jsUInt32Class, enqueuer, registry);
+      addInterceptors(jsUInt31Class, enqueuer, registry);
+      addInterceptors(jsNumberClass, enqueuer, registry);
     } else if (cls == compiler.doubleClass || cls == jsDoubleClass) {
-      addInterceptors(jsDoubleClass, enqueuer, elements);
-      addInterceptors(jsNumberClass, enqueuer, elements);
+      addInterceptors(jsDoubleClass, enqueuer, registry);
+      addInterceptors(jsNumberClass, enqueuer, registry);
     } else if (cls == compiler.boolClass || cls == jsBoolClass) {
-      addInterceptors(jsBoolClass, enqueuer, elements);
+      addInterceptors(jsBoolClass, enqueuer, registry);
     } else if (cls == compiler.nullClass || cls == jsNullClass) {
-      addInterceptors(jsNullClass, enqueuer, elements);
+      addInterceptors(jsNullClass, enqueuer, registry);
     } else if (cls == compiler.numClass || cls == jsNumberClass) {
-      addInterceptors(jsIntClass, enqueuer, elements);
-      addInterceptors(jsPositiveIntClass, enqueuer, elements);
-      addInterceptors(jsUInt32Class, enqueuer, elements);
-      addInterceptors(jsUInt31Class, enqueuer, elements);
-      addInterceptors(jsDoubleClass, enqueuer, elements);
-      addInterceptors(jsNumberClass, enqueuer, elements);
+      addInterceptors(jsIntClass, enqueuer, registry);
+      addInterceptors(jsPositiveIntClass, enqueuer, registry);
+      addInterceptors(jsUInt32Class, enqueuer, registry);
+      addInterceptors(jsUInt31Class, enqueuer, registry);
+      addInterceptors(jsDoubleClass, enqueuer, registry);
+      addInterceptors(jsNumberClass, enqueuer, registry);
     } else if (cls == jsPlainJavaScriptObjectClass) {
-      addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, elements);
+      addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, registry);
     } else if (cls == jsUnknownJavaScriptObjectClass) {
-      addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements);
+      addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, registry);
     } else if (Elements.isNativeOrExtendsNative(cls)) {
       addInterceptorsForNativeClassMembers(cls, enqueuer);
     } else if (cls == jsIndexingBehaviorInterface) {
@@ -822,11 +822,11 @@
       enqueue(
           enqueuer,
           compiler.findHelper('isJsIndexable'),
-          elements);
+          registry);
       enqueue(
           enqueuer,
           compiler.findInterceptor('dispatchPropertyName'),
-          elements);
+          registry);
     }
 
     customElementsAnalysis.registerInstantiatedClass(cls, enqueuer);
@@ -835,9 +835,9 @@
   void registerUseInterceptor(Enqueuer enqueuer) {
     assert(!enqueuer.isResolutionQueue);
     if (!enqueuer.nativeEnqueuer.hasInstantiatedNativeClasses()) return;
-    TreeElements elements = compiler.globalDependencies;
-    enqueue(enqueuer, getNativeInterceptorMethod, elements);
-    enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, elements);
+    Registry registry = compiler.globalDependencies;
+    enqueue(enqueuer, getNativeInterceptorMethod, registry);
+    enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, registry);
     needToInitializeIsolateAffinityTag = true;
     needToInitializeDispatchProperty = true;
   }
@@ -846,57 +846,57 @@
     return new JavaScriptItemCompilationContext();
   }
 
-  void enqueueHelpers(ResolutionEnqueuer world, TreeElements elements) {
+  void enqueueHelpers(ResolutionEnqueuer world, Registry registry) {
     // TODO(ngeoffray): Not enqueuing those two classes currently make
     // the compiler potentially crash. However, any reasonable program
     // will instantiate those two classes.
-    addInterceptors(jsBoolClass, world, elements);
-    addInterceptors(jsNullClass, world, elements);
+    addInterceptors(jsBoolClass, world, registry);
+    addInterceptors(jsNullClass, world, registry);
     if (compiler.enableTypeAssertions) {
       // Unconditionally register the helper that checks if the
       // expression in an if/while/for is a boolean.
       // TODO(ngeoffray): Should we have the resolver register those instead?
       Element e =
           compiler.findHelper('boolConversionCheck');
-      if (e != null) enqueue(world, e, elements);
+      if (e != null) enqueue(world, e, registry);
     }
-    registerCheckedModeHelpers(elements);
+    registerCheckedModeHelpers(registry);
   }
 
   onResolutionComplete() => rti.computeClassesNeedingRti();
 
-  void registerStringInterpolation(TreeElements elements) {
-    enqueueInResolution(getStringInterpolationHelper(), elements);
+  void registerStringInterpolation(Registry registry) {
+    enqueueInResolution(getStringInterpolationHelper(), registry);
   }
 
-  void registerCatchStatement(Enqueuer enqueuer, TreeElements elements) {
+  void registerCatchStatement(Enqueuer enqueuer, Registry registry) {
     void ensure(ClassElement classElement) {
       if (classElement != null) {
-        enqueueClass(enqueuer, classElement, elements);
+        enqueueClass(enqueuer, classElement, registry);
       }
     }
-    enqueueInResolution(getExceptionUnwrapper(), elements);
+    enqueueInResolution(getExceptionUnwrapper(), registry);
     ensure(jsPlainJavaScriptObjectClass);
     ensure(jsUnknownJavaScriptObjectClass);
   }
 
-  void registerThrowExpression(TreeElements elements) {
+  void registerThrowExpression(Registry registry) {
     // We don't know ahead of time whether we will need the throw in a
     // statement context or an expression context, so we register both
     // here, even though we may not need the throwExpression helper.
-    enqueueInResolution(getWrapExceptionHelper(), elements);
-    enqueueInResolution(getThrowExpressionHelper(), elements);
+    enqueueInResolution(getWrapExceptionHelper(), registry);
+    enqueueInResolution(getThrowExpressionHelper(), registry);
   }
 
-  void registerLazyField(TreeElements elements) {
-    enqueueInResolution(getCyclicThrowHelper(), elements);
+  void registerLazyField(Registry registry) {
+    enqueueInResolution(getCyclicThrowHelper(), registry);
   }
 
   void registerTypeLiteral(Element element,
                            Enqueuer enqueuer,
-                           TreeElements elements) {
-    enqueuer.registerInstantiatedClass(typeImplementation, elements);
-    enqueueInResolution(getCreateRuntimeType(), elements);
+                           Registry registry) {
+    enqueuer.registerInstantiatedClass(typeImplementation, registry);
+    enqueueInResolution(getCreateRuntimeType(), registry);
     // TODO(ahe): Might want to register [element] as an instantiated class
     // when reflection is used.  However, as long as we disable tree-shaking
     // eagerly it doesn't matter.
@@ -906,62 +906,62 @@
     customElementsAnalysis.registerTypeLiteral(element, enqueuer);
   }
 
-  void registerStackTraceInCatch(TreeElements elements) {
-    enqueueInResolution(getTraceFromException(), elements);
+  void registerStackTraceInCatch(Registry registry) {
+    enqueueInResolution(getTraceFromException(), registry);
   }
 
-  void registerGetRuntimeTypeArgument(TreeElements elements) {
-    enqueueInResolution(getGetRuntimeTypeArgument(), elements);
-    enqueueInResolution(getGetTypeArgumentByIndex(), elements);
-    enqueueInResolution(getCopyTypeArguments(), elements);
+  void registerGetRuntimeTypeArgument(Registry registry) {
+    enqueueInResolution(getGetRuntimeTypeArgument(), registry);
+    enqueueInResolution(getGetTypeArgumentByIndex(), registry);
+    enqueueInResolution(getCopyTypeArguments(), registry);
   }
 
   void registerGenericCallMethod(Element callMethod,
-                                 Enqueuer enqueuer, TreeElements elements) {
+                                 Enqueuer enqueuer, Registry registry) {
     if (enqueuer.isResolutionQueue || methodNeedsRti(callMethod)) {
-      registerComputeSignature(enqueuer, elements);
+      registerComputeSignature(enqueuer, registry);
     }
   }
 
   void registerGenericClosure(Element closure,
-                              Enqueuer enqueuer, TreeElements elements) {
+                              Enqueuer enqueuer, Registry registry) {
     if (enqueuer.isResolutionQueue || methodNeedsRti(closure)) {
-      registerComputeSignature(enqueuer, elements);
+      registerComputeSignature(enqueuer, registry);
     }
   }
 
-  void registerComputeSignature(Enqueuer enqueuer, TreeElements elements) {
+  void registerComputeSignature(Enqueuer enqueuer, Registry registry) {
     // Calls to [:computeSignature:] are generated by the emitter and we
     // therefore need to enqueue the used elements in the codegen enqueuer as
     // well as in the resolution enqueuer.
-    enqueue(enqueuer, getSetRuntimeTypeInfo(), elements);
-    enqueue(enqueuer, getGetRuntimeTypeInfo(), elements);
-    enqueue(enqueuer, getComputeSignature(), elements);
-    enqueue(enqueuer, getGetRuntimeTypeArguments(), elements);
-    enqueueClass(enqueuer, compiler.listClass, elements);
+    enqueue(enqueuer, getSetRuntimeTypeInfo(), registry);
+    enqueue(enqueuer, getGetRuntimeTypeInfo(), registry);
+    enqueue(enqueuer, getComputeSignature(), registry);
+    enqueue(enqueuer, getGetRuntimeTypeArguments(), registry);
+    enqueueClass(enqueuer, compiler.listClass, registry);
   }
 
-  void registerRuntimeType(Enqueuer enqueuer, TreeElements elements) {
-    registerComputeSignature(enqueuer, elements);
-    enqueueInResolution(getSetRuntimeTypeInfo(), elements);
-    enqueueInResolution(getGetRuntimeTypeInfo(), elements);
-    registerGetRuntimeTypeArgument(elements);
-    enqueueClass(enqueuer, compiler.listClass, elements);
+  void registerRuntimeType(Enqueuer enqueuer, Registry registry) {
+    registerComputeSignature(enqueuer, registry);
+    enqueueInResolution(getSetRuntimeTypeInfo(), registry);
+    enqueueInResolution(getGetRuntimeTypeInfo(), registry);
+    registerGetRuntimeTypeArgument(registry);
+    enqueueClass(enqueuer, compiler.listClass, registry);
   }
 
-  void registerTypeVariableExpression(TreeElements elements) {
-    enqueueInResolution(getSetRuntimeTypeInfo(), elements);
-    enqueueInResolution(getGetRuntimeTypeInfo(), elements);
-    registerGetRuntimeTypeArgument(elements);
-    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, elements);
-    enqueueInResolution(getRuntimeTypeToString(), elements);
-    enqueueInResolution(getCreateRuntimeType(), elements);
+  void registerTypeVariableExpression(Registry registry) {
+    enqueueInResolution(getSetRuntimeTypeInfo(), registry);
+    enqueueInResolution(getGetRuntimeTypeInfo(), registry);
+    registerGetRuntimeTypeArgument(registry);
+    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, registry);
+    enqueueInResolution(getRuntimeTypeToString(), registry);
+    enqueueInResolution(getCreateRuntimeType(), registry);
   }
 
-  void registerIsCheck(DartType type, Enqueuer world, TreeElements elements) {
-    enqueueInResolution(getThrowRuntimeError(), elements);
+  void registerIsCheck(DartType type, Enqueuer world, Registry registry) {
+    enqueueInResolution(getThrowRuntimeError(), registry);
     type = type.unalias(compiler);
-    enqueueClass(world, compiler.boolClass, elements);
+    enqueueClass(world, compiler.boolClass, registry);
     bool inCheckedMode = compiler.enableTypeAssertions;
     // [registerIsCheck] is also called for checked mode checks, so we
     // need to register checked mode helpers.
@@ -973,38 +973,38 @@
         // TODO(13155): Find a way to enqueue helpers lazily.
         CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: false);
         if (helper != null) {
-          enqueue(world, helper.getElement(compiler), elements);
+          enqueue(world, helper.getElement(compiler), registry);
         }
         // We also need the native variant of the check (for DOM types).
         helper = getNativeCheckedModeHelper(type, typeCast: false);
         if (helper != null) {
-          enqueue(world, helper.getElement(compiler), elements);
+          enqueue(world, helper.getElement(compiler), registry);
         }
       }
     }
     bool isTypeVariable = type.kind == TypeKind.TYPE_VARIABLE;
     if (type.kind == TypeKind.MALFORMED_TYPE) {
-      enqueueInResolution(getThrowTypeError(), elements);
+      enqueueInResolution(getThrowTypeError(), registry);
     }
     if (!type.treatAsRaw || type.containsTypeVariables) {
-      enqueueInResolution(getSetRuntimeTypeInfo(), elements);
-      enqueueInResolution(getGetRuntimeTypeInfo(), elements);
-      registerGetRuntimeTypeArgument(elements);
+      enqueueInResolution(getSetRuntimeTypeInfo(), registry);
+      enqueueInResolution(getGetRuntimeTypeInfo(), registry);
+      registerGetRuntimeTypeArgument(registry);
       if (inCheckedMode) {
-        enqueueInResolution(getAssertSubtype(), elements);
+        enqueueInResolution(getAssertSubtype(), registry);
       }
-      enqueueInResolution(getCheckSubtype(), elements);
+      enqueueInResolution(getCheckSubtype(), registry);
       if (isTypeVariable) {
-        enqueueInResolution(getCheckSubtypeOfRuntimeType(), elements);
+        enqueueInResolution(getCheckSubtypeOfRuntimeType(), registry);
         if (inCheckedMode) {
-          enqueueInResolution(getAssertSubtypeOfRuntimeType(), elements);
+          enqueueInResolution(getAssertSubtypeOfRuntimeType(), registry);
         }
       }
-      enqueueClass(world, compiler.listClass, elements);
+      enqueueClass(world, compiler.listClass, registry);
     }
     if (type is FunctionType) {
       enqueueInResolution(
-          compiler.findHelper('functionTypeTestMetaHelper'), elements);
+          compiler.findHelper('functionTypeTestMetaHelper'), registry);
     }
     if (type.element != null && type.element.isNative) {
       // We will neeed to add the "$is" and "$as" properties on the
@@ -1012,12 +1012,12 @@
       // [:defineProperty:] is compiled.
       enqueue(world,
               compiler.findHelper('defineProperty'),
-              elements);
+              registry);
     }
   }
 
-  void registerAsCheck(DartType type, Enqueuer world, TreeElements elements) {
-    enqueueInResolution(getThrowRuntimeError(), elements);
+  void registerAsCheck(DartType type, Enqueuer world, Registry registry) {
+    enqueueInResolution(getThrowRuntimeError(), registry);
     type = type.unalias(compiler);
     if (!world.isResolutionQueue) {
       // All helpers are added to resolution queue in enqueueHelpers. These
@@ -1025,26 +1025,26 @@
       // fact added.
       // TODO(13155): Find a way to enqueue helpers lazily.
       CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: true);
-      enqueueInResolution(helper.getElement(compiler), elements);
+      enqueueInResolution(helper.getElement(compiler), registry);
       // We also need the native variant of the check (for DOM types).
       helper = getNativeCheckedModeHelper(type, typeCast: true);
       if (helper != null) {
-        enqueueInResolution(helper.getElement(compiler), elements);
+        enqueueInResolution(helper.getElement(compiler), registry);
       }
     }
   }
 
-  void registerThrowNoSuchMethod(TreeElements elements) {
-    enqueueInResolution(getThrowNoSuchMethod(), elements);
+  void registerThrowNoSuchMethod(Registry registry) {
+    enqueueInResolution(getThrowNoSuchMethod(), registry);
     // Also register the types of the arguments passed to this method.
-    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, elements);
-    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, elements);
+    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, registry);
+    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
   }
 
-  void registerThrowRuntimeError(TreeElements elements) {
-    enqueueInResolution(getThrowRuntimeError(), elements);
+  void registerThrowRuntimeError(Registry registry) {
+    enqueueInResolution(getThrowRuntimeError(), registry);
     // Also register the types of the arguments passed to this method.
-    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, elements);
+    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
   }
 
   void registerTypeVariableBoundsSubtypeCheck(DartType typeArgument,
@@ -1052,25 +1052,25 @@
     rti.registerTypeVariableBoundsSubtypeCheck(typeArgument, bound);
   }
 
-  void registerTypeVariableBoundCheck(TreeElements elements) {
-    enqueueInResolution(getThrowTypeError(), elements);
-    enqueueInResolution(getAssertIsSubtype(), elements);
+  void registerTypeVariableBoundCheck(Registry registry) {
+    enqueueInResolution(getThrowTypeError(), registry);
+    enqueueInResolution(getAssertIsSubtype(), registry);
   }
 
-  void registerAbstractClassInstantiation(TreeElements elements) {
-    enqueueInResolution(getThrowAbstractClassInstantiationError(), elements);
+  void registerAbstractClassInstantiation(Registry registry) {
+    enqueueInResolution(getThrowAbstractClassInstantiationError(), registry);
     // Also register the types of the arguments passed to this method.
-    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, elements);
+    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
   }
 
-  void registerFallThroughError(TreeElements elements) {
-    enqueueInResolution(getFallThroughError(), elements);
+  void registerFallThroughError(Registry registry) {
+    enqueueInResolution(getFallThroughError(), registry);
   }
 
-  void registerCheckDeferredIsLoaded(TreeElements elements) {
-    enqueueInResolution(getCheckDeferredIsLoaded(), elements);
+  void registerCheckDeferredIsLoaded(Registry registry) {
+    enqueueInResolution(getCheckDeferredIsLoaded(), registry);
     // Also register the types of the arguments passed to this method.
-    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, elements);
+    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
   }
 
   void enableNoSuchMethod(Enqueuer world) {
@@ -1078,12 +1078,12 @@
     world.registerInvocation(compiler.noSuchMethodSelector);
   }
 
-  void registerSuperNoSuchMethod(TreeElements elements) {
-    enqueueInResolution(getCreateInvocationMirror(), elements);
+  void registerSuperNoSuchMethod(Registry registry) {
+    enqueueInResolution(getCreateInvocationMirror(), registry);
     enqueueInResolution(
         compiler.objectClass.lookupLocalMember(Compiler.NO_SUCH_METHOD),
-        elements);
-    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, elements);
+        registry);
+    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, registry);
   }
 
   void registerRequiredType(DartType type, Element enclosingElement) {
@@ -1136,20 +1136,20 @@
   // optimizations, so they would make these optimizations unsound.
   // Therefore we need to collect the list of helpers the backend may
   // use.
-  void enqueue(Enqueuer enqueuer, Element e, TreeElements elements) {
+  void enqueue(Enqueuer enqueuer, Element e, Registry registry) {
     if (e == null) return;
     helpersUsed.add(e.declaration);
     enqueuer.addToWorkList(e);
-    elements.registerDependency(e);
+    registry.registerDependency(e);
   }
 
-  void enqueueInResolution(Element e, TreeElements elements) {
+  void enqueueInResolution(Element e, Registry registry) {
     if (e == null) return;
     ResolutionEnqueuer enqueuer = compiler.enqueuer.resolution;
-    enqueue(enqueuer, e, elements);
+    enqueue(enqueuer, e, registry);
   }
 
-  void enqueueClass(Enqueuer enqueuer, Element cls, TreeElements elements) {
+  void enqueueClass(Enqueuer enqueuer, Element cls, Registry registry) {
     if (cls == null) return;
     helpersUsed.add(cls.declaration);
     // Both declaration and implementation may declare fields, so we
@@ -1157,14 +1157,14 @@
     if (cls.declaration != cls.implementation) {
       helpersUsed.add(cls.implementation);
     }
-    enqueuer.registerInstantiatedClass(cls, elements);
+    enqueuer.registerInstantiatedClass(cls, registry);
   }
 
-  void registerConstantMap(TreeElements elements) {
+  void registerConstantMap(Registry registry) {
     void enqueue(String name) {
       Element e = compiler.findHelper(name);
       if (e != null) {
-        enqueueClass(compiler.enqueuer.resolution, e, elements);
+        enqueueClass(compiler.enqueuer.resolution, e, registry);
       }
     }
 
@@ -1185,7 +1185,7 @@
     if (kind.category == ElementCategory.VARIABLE) {
       Constant initialValue = constants.getConstantForVariable(element);
       if (initialValue != null) {
-        registerCompileTimeConstant(initialValue, work.resolutionTree);
+        registerCompileTimeConstant(initialValue, work.registry);
         constants.addCompileTimeConstantForEmission(initialValue);
         // We don't need to generate code for static or top-level
         // variables. For instance variables, we may need to generate
@@ -1417,11 +1417,11 @@
     }
   }
 
-  void registerCheckedModeHelpers(TreeElements elements) {
+  void registerCheckedModeHelpers(Registry registry) {
     // We register all the helpers in the resolution queue.
     // TODO(13155): Find a way to register fewer helpers.
     for (CheckedModeHelper helper in checkedModeHelpers) {
-      enqueueInResolution(helper.getElement(compiler), elements);
+      enqueueInResolution(helper.getElement(compiler), registry);
     }
   }
 
@@ -1599,7 +1599,7 @@
   }
 
   /// Called when [:const Symbol(name):] is seen.
-  void registerConstSymbol(String name, TreeElements elements) {
+  void registerConstSymbol(String name, Registry registry) {
     symbolsUsed.add(name);
     if (name.endsWith('=')) {
       symbolsUsed.add(name.substring(0, name.length - 1));
@@ -1607,14 +1607,14 @@
   }
 
   /// Called when [:new Symbol(...):] is seen.
-  void registerNewSymbol(TreeElements elements) {
+  void registerNewSymbol(Registry registry) {
   }
 
   /// Called when resolving the `Symbol` constructor.
-  void registerSymbolConstructor(TreeElements elements) {
+  void registerSymbolConstructor(Registry registry) {
     // Make sure that _internals.Symbol.validated is registered.
     assert(compiler.symbolValidatedConstructor != null);
-    enqueueInResolution(compiler.symbolValidatedConstructor, elements);
+    enqueueInResolution(compiler.symbolValidatedConstructor, registry);
   }
 
   /// Should [element] (a getter) be retained for reflection?
@@ -1841,7 +1841,7 @@
       compiler.libraries.values.forEach(retainMetadataOf);
       for (Dependency dependency in metadataConstants) {
         registerCompileTimeConstant(
-            dependency.constant, dependency.user);
+            dependency.constant, dependency.registry);
       }
       metadataConstants.clear();
     }
@@ -1908,10 +1908,11 @@
   }
 }
 
-/// Records that [constant] is used by [user.element].
+/// Records that [constant] is used by the element behind [registry].
 class Dependency {
   final Constant constant;
-  final TreeElements user;
+  // TODO(johnniwinther): Change to [Element] when dependency nodes are added.
+  final Registry registry;
 
-  const Dependency(this.constant, this.user);
+  const Dependency(this.constant, this.registry);
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart b/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart
index caf52b0..de280c4 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/checked_mode_helpers.dart
@@ -14,7 +14,7 @@
   jsAst.Expression generateCall(SsaCodeGenerator codegen,
                                 HTypeConversion node) {
     Element helperElement = getElement(codegen.compiler);
-    codegen.world.registerStaticUse(helperElement);
+    codegen.registry.registerStaticUse(helperElement);
     List<jsAst.Expression> arguments = <jsAst.Expression>[];
     codegen.use(node.checkedInput);
     arguments.add(codegen.pop());
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 da4f781..8f3a378 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
@@ -67,7 +67,7 @@
       List<int> constants = <int>[];
       evaluator = new CompileTimeConstantEvaluator(
           backend.constants,
-          compiler.globalDependencies,
+          compiler.globalDependencies.mapping,
           compiler);
 
       for (TypeVariableType currentTypeVariable in cls.typeVariables) {
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 6b2b84f..7430e33 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
@@ -526,7 +526,7 @@
     // isolateProperties themselves.
     return js('''
       function (oldIsolate) {
-        var isolateProperties = oldIsolate.${namer.isolatePropertiesName};
+        var isolateProperties = oldIsolate.#;
         function Isolate() {
           var hasOwnProperty = Object.prototype.hasOwnProperty;
           for (var staticName in isolateProperties)
@@ -541,14 +541,16 @@
         }
         Isolate.prototype = oldIsolate.prototype;
         Isolate.prototype.constructor = Isolate;
-        Isolate.${namer.isolatePropertiesName} = isolateProperties;
+        Isolate.# = isolateProperties;
         if (#)
-          Isolate.$finishClassesProperty = oldIsolate.$finishClassesProperty;
+          Isolate.# = oldIsolate.#;
         if (#)
-          Isolate.$makeConstListProperty = oldIsolate.$makeConstListProperty;
+          Isolate.# = oldIsolate.#;
         return Isolate;
       }''',
-        [ needsDefineClass, hasMakeConstantList ]);
+        [namer.isolatePropertiesName, namer.isolatePropertiesName,
+         needsDefineClass, finishClassesProperty, finishClassesProperty,
+         hasMakeConstantList, makeConstListProperty, makeConstListProperty ]);
   }
 
   jsAst.Fun get lazyInitializerFunction {
@@ -947,16 +949,16 @@
   void emitMakeConstantListIfNotEmitted(CodeBuffer buffer) {
     if (hasMakeConstantList) return;
     hasMakeConstantList = true;
-    jsAst.Expression value = new jsAst.Assignment(
-            new jsAst.PropertyAccess.field(
-                new jsAst.VariableUse(namer.isolateName),
-                makeConstListProperty),
-            js('''function(list) {
-                    list.immutable\$list = $initName;
-                    list.fixed\$length = $initName;
-                    return list;
-                  }'''));
-    buffer.write(jsAst.prettyPrint(value, compiler));
+    buffer.write(
+        jsAst.prettyPrint(
+            js.statement(r'''#.# = function(list) {
+                                     list.immutable$list = #;
+                                     list.fixed$length = #;
+                                     return list;
+                                   }''',
+                         [namer.isolateName, makeConstListProperty, initName,
+                          initName]),
+            compiler));
     buffer.write(N);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index 7530c86..1d21994 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -476,13 +476,9 @@
     Compiler compiler = declaration.mirrorSystem.compiler;
     return declaration._element.metadata.toList().map((metadata) {
       var node = metadata.parseNode(compiler);
-      Element annotatedElement = metadata.annotatedElement;
-      var context = annotatedElement.enclosingElement;
-      if (context == null) {
-        context = annotatedElement;
-      }
+      var treeElements = metadata.annotatedElement.treeElements;
       return new ResolvedNode(
-          node, context.treeElements, declaration.mirrorSystem);
+          node, treeElements, declaration.mirrorSystem);
     });
   }
 
@@ -496,8 +492,7 @@
   static ResolvedNode defaultValueSyntaxOf(Dart2JsParameterMirror parameter) {
     if (!parameter.hasDefaultValue) return null;
     var node = parameter._element.initializer;
-    return new ResolvedNode(node,
-        (parameter.owner as Dart2JsElementMirror)._element.treeElements,
-        parameter.mirrorSystem);
+    var treeElements = parameter._element.treeElements;
+    return new ResolvedNode(node, treeElements, parameter.mirrorSystem);
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index 5f3f466..cf35086 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -456,34 +456,34 @@
 
   processNativeBehavior(NativeBehavior behavior, cause) {
     // TODO(ahe): Is this really a global dependency?
-    TreeElements elements = compiler.globalDependencies;
+    Registry registry = compiler.globalDependencies;
     bool allUsedBefore = unusedClasses.isEmpty;
     for (var type in behavior.typesInstantiated) {
       if (matchedTypeConstraints.contains(type)) continue;
       matchedTypeConstraints.add(type);
       if (type is SpecialType) {
         if (type == SpecialType.JsObject) {
-          world.registerInstantiatedClass(compiler.objectClass, elements);
+          world.registerInstantiatedClass(compiler.objectClass, registry);
         }
         continue;
       }
       if (type is InterfaceType) {
         if (type.element == compiler.intClass) {
-          world.registerInstantiatedClass(compiler.intClass, elements);
+          world.registerInstantiatedClass(compiler.intClass, registry);
         } else if (type.element == compiler.doubleClass) {
-          world.registerInstantiatedClass(compiler.doubleClass, elements);
+          world.registerInstantiatedClass(compiler.doubleClass, registry);
         } else if (type.element == compiler.numClass) {
-          world.registerInstantiatedClass(compiler.doubleClass, elements);
-          world.registerInstantiatedClass(compiler.intClass, elements);
+          world.registerInstantiatedClass(compiler.doubleClass, registry);
+          world.registerInstantiatedClass(compiler.intClass, registry);
         } else if (type.element == compiler.stringClass) {
-          world.registerInstantiatedClass(compiler.stringClass, elements);
+          world.registerInstantiatedClass(compiler.stringClass, registry);
         } else if (type.element == compiler.nullClass) {
-          world.registerInstantiatedClass(compiler.nullClass, elements);
+          world.registerInstantiatedClass(compiler.nullClass, registry);
         } else if (type.element == compiler.boolClass) {
-          world.registerInstantiatedClass(compiler.boolClass, elements);
+          world.registerInstantiatedClass(compiler.boolClass, registry);
         } else if (compiler.types.isSubtype(
                       type, compiler.backend.listImplementation.rawType)) {
-          world.registerInstantiatedClass(type.element, elements);
+          world.registerInstantiatedClass(type.element, registry);
         }
       }
       assert(type is DartType);
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 2ffddf4..af25fce 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -184,6 +184,7 @@
   }
 
   void registerDependency(Element element) {
+    if (element == null) return;
     otherDependencies.add(element.implementation);
   }
 
@@ -259,8 +260,11 @@
     return measure(() {
       if (Elements.isErroneousElement(element)) return null;
 
-      for (MetadataAnnotation metadata in element.metadata) {
-        metadata.ensureResolved(compiler);
+      processMetadata([result]) {
+        for (MetadataAnnotation metadata in element.metadata) {
+          metadata.ensureResolved(compiler);
+        }
+        return result;
       }
 
       ElementKind kind = element.kind;
@@ -268,18 +272,19 @@
           identical(kind, ElementKind.FUNCTION) ||
           identical(kind, ElementKind.GETTER) ||
           identical(kind, ElementKind.SETTER)) {
-        return resolveMethodElement(element);
+        return processMetadata(resolveMethodElement(element));
       }
 
-      if (identical(kind, ElementKind.FIELD)) return resolveField(element);
-
+      if (identical(kind, ElementKind.FIELD)) {
+        return processMetadata(resolveField(element));
+      }
       if (element.isClass) {
         ClassElement cls = element;
         cls.ensureResolved(compiler);
-        return null;
+        return processMetadata();
       } else if (element.isTypedef) {
         TypedefElement typdef = element;
-        return resolveTypedef(typdef);
+        return processMetadata(resolveTypedef(typdef));
       }
 
       compiler.unimplemented(element, "resolve($element)");
@@ -546,11 +551,16 @@
     });
   }
 
+  /// Creates a [ResolverVisitor] for resolving an AST in context of [element].
+  /// If [useEnclosingScope] is `true` then the initial scope of the visitor
+  /// does not include inner scope of [element].
+  ///
   /// This method should only be used by this library (or tests of
   /// this library).
-  ResolverVisitor visitorFor(Element element) {
+  ResolverVisitor visitorFor(Element element, {bool useEnclosingScope: false}) {
     return new ResolverVisitor(compiler, element,
-        new ResolutionRegistry(compiler, element));
+        new ResolutionRegistry(compiler, element),
+        useEnclosingScope: useEnclosingScope);
   }
 
   TreeElements resolveField(VariableElementX element) {
@@ -1175,12 +1185,14 @@
       ResolutionRegistry registry = new ResolutionRegistry(compiler, element);
       return compiler.withCurrentElement(element, () {
         return measure(() {
+          assert(element.resolutionState == STATE_NOT_STARTED);
+          element.resolutionState = STATE_STARTED;
           Typedef node =
             compiler.parser.measure(() => element.parseNode(compiler));
           TypedefResolverVisitor visitor =
             new TypedefResolverVisitor(compiler, element, registry);
           visitor.visit(node);
-
+          element.resolutionState = STATE_DONE;
           return registry.mapping;
         });
       });
@@ -1193,14 +1205,12 @@
       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) {
-        context = annotatedElement;
-      }
-      ResolverVisitor visitor = visitorFor(context);
+      AnalyzableElement context = annotatedElement.analyzableElement;
+      assert(invariant(node, context != null,
+          message: "No context found for metadata annotation "
+                   "on $annotatedElement."));
+      ResolverVisitor visitor = visitorFor(context, useEnclosingScope: true);
       ResolutionRegistry registry = visitor.registry;
       node.accept(visitor);
       // TODO(johnniwinther): Avoid passing the [TreeElements] to
@@ -1208,8 +1218,8 @@
       annotation.value =
           constantCompiler.compileMetadata(annotation, node, registry.mapping);
       // TODO(johnniwinther): Register the relation between the annotation
-      // and the annotated element instead. This will allow the backed to
-      // retrieve the backend constant and only registered metadata on the
+      // and the annotated element instead. This will allow the backend to
+      // retrieve the backend constant and only register metadata on the
       // elements for which it is needed. (Issue 17732).
       registry.registerMetadataConstant(annotation.value);
       annotation.resolutionState = STATE_DONE;
@@ -1766,6 +1776,8 @@
         type = checkNoTypeArguments(element.computeType(compiler));
       } else if (element.isClass) {
         ClassElement cls = element;
+        // TODO(johnniwinther): [_ensureClassWillBeResolved] should imply
+        // [computeType].
         compiler.resolver._ensureClassWillBeResolved(cls);
         element.computeType(compiler);
         var arguments = new LinkBuilder<DartType>();
@@ -1785,8 +1797,9 @@
         }
       } else if (element.isTypedef) {
         TypedefElement typdef = element;
-        // TODO(ahe): Should be [ensureResolved].
-        compiler.resolveTypedef(typdef);
+        // TODO(johnniwinther): [ensureResolved] should imply [computeType].
+        typdef.ensureResolved(compiler);
+        element.computeType(compiler);
         var arguments = new LinkBuilder<DartType>();
         bool hasTypeArgumentMismatch = resolveTypeArguments(
             visitor, node, typdef.typeVariables, arguments);
@@ -2002,7 +2015,8 @@
 
   ResolverVisitor(Compiler compiler,
                   Element element,
-                  ResolutionRegistry registry)
+                  ResolutionRegistry registry,
+                  {bool useEnclosingScope: false})
     : this.enclosingElement = element,
       // When the element is a field, we are actually resolving its
       // initial value, which should not have access to instance
@@ -2012,7 +2026,8 @@
       this.currentClass = element.isMember ? element.enclosingClass
                                              : null,
       this.statementScope = new StatementScope(),
-      scope = element.buildScope(),
+      scope = useEnclosingScope
+          ? Scope.buildEnclosingScope(element) : element.buildScope(),
       // The type annotations on a typedef do not imply type checks.
       // TODO(karlklose): clean this up (dartbug.com/8870).
       inCheckContext = compiler.enableTypeAssertions &&
@@ -3925,7 +3940,7 @@
  * types.
  */
 class ClassResolverVisitor extends TypeDefinitionVisitor {
-  ClassElement get element => enclosingElement;
+  BaseClassElementX get element => enclosingElement;
 
   ClassResolverVisitor(Compiler compiler,
                        ClassElement classElement,
@@ -4656,14 +4671,14 @@
   return Elements.unwrap(scope.lookup(name), compiler, node);
 }
 
-TreeElements _ensureTreeElements(AnalyzableElement element) {
+TreeElements _ensureTreeElements(AnalyzableElementX element) {
   if (element._treeElements == null) {
     element._treeElements = new TreeElementMapping(element);
   }
   return element._treeElements;
 }
 
-abstract class AnalyzableElement implements Element {
+abstract class AnalyzableElementX implements AnalyzableElement {
   TreeElements _treeElements;
 
   bool get hasTreeElements => _treeElements != null;
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/registry.dart b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
index 01ef096..843684b 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
@@ -8,7 +8,7 @@
 /// related information in a [TreeElements] mapping and registers calls with
 /// [Backend], [World] and [Enqueuer].
 // TODO(johnniwinther): Split this into an interface and implementation class.
-class ResolutionRegistry {
+class ResolutionRegistry extends Registry {
   final Compiler compiler;
   final TreeElementMapping mapping;
 
@@ -188,43 +188,43 @@
   }
 
   void registerImplicitSuperCall(FunctionElement superConstructor) {
-    universe.registerImplicitSuperCall(mapping, superConstructor);
+    universe.registerImplicitSuperCall(this, superConstructor);
   }
 
   void registerInstantiatedClass(ClassElement element) {
-    world.registerInstantiatedClass(element, mapping);
+    world.registerInstantiatedClass(element, this);
   }
 
   void registerLazyField() {
-    backend.registerLazyField(mapping);
+    backend.registerLazyField(this);
   }
 
   void registerMetadataConstant(Constant constant) {
-    backend.registerMetadataConstant(constant, mapping);
+    backend.registerMetadataConstant(constant, this);
   }
 
   void registerThrowRuntimeError() {
-    backend.registerThrowRuntimeError(mapping);
+    backend.registerThrowRuntimeError(this);
   }
 
   void registerTypeVariableBoundCheck() {
-    backend.registerTypeVariableBoundCheck(mapping);
+    backend.registerTypeVariableBoundCheck(this);
   }
 
   void registerThrowNoSuchMethod() {
-    backend.registerThrowNoSuchMethod(mapping);
+    backend.registerThrowNoSuchMethod(this);
   }
 
   void registerIsCheck(DartType type) {
-    world.registerIsCheck(type, mapping);
+    world.registerIsCheck(type, this);
   }
 
   void registerAsCheck(DartType type) {
-    world.registerAsCheck(type, mapping);
+    world.registerAsCheck(type, this);
   }
 
   void registerClosure(Element element) {
-    world.registerClosure(element, mapping);
+    world.registerClosure(element, this);
   }
 
   void registerSuperUse(Node node) {
@@ -236,7 +236,7 @@
   }
 
   void registerSuperNoSuchMethod() {
-    backend.registerSuperNoSuchMethod(mapping);
+    backend.registerSuperNoSuchMethod(this);
   }
 
   void registerClassUsingVariableExpression(ClassElement element) {
@@ -244,11 +244,11 @@
   }
 
   void registerTypeVariableExpression() {
-    backend.registerTypeVariableExpression(mapping);
+    backend.registerTypeVariableExpression(this);
   }
 
   void registerTypeLiteral(Element element) {
-    world.registerTypeLiteral(element, mapping);
+    world.registerTypeLiteral(element, this);
   }
 
   // TODO(johnniwinther): Remove the [ResolverVisitor] dependency. Its only
@@ -270,27 +270,27 @@
   }
 
   void registerConstSymbol(String name) {
-    world.registerConstSymbol(name, mapping);
+    world.registerConstSymbol(name, this);
   }
 
   void registerSymbolConstructor() {
-    backend.registerSymbolConstructor(mapping);
+    backend.registerSymbolConstructor(this);
   }
 
   void registerInstantiatedType(InterfaceType type) {
-    world.registerInstantiatedType(type, mapping);
+    world.registerInstantiatedType(type, this);
   }
 
   void registerFactoryWithTypeArguments() {
-    world.registerFactoryWithTypeArguments(mapping);
+    world.registerFactoryWithTypeArguments(this);
   }
 
   void registerAbstractClassInstantiation() {
-    backend.registerAbstractClassInstantiation(mapping);
+    backend.registerAbstractClassInstantiation(this);
   }
 
   void registerNewSymbol() {
-    world.registerNewSymbol(mapping);
+    world.registerNewSymbol(this);
   }
 
   void registerRequiredType(DartType type, Element enclosingElement) {
@@ -298,23 +298,23 @@
   }
 
   void registerStringInterpolation() {
-    backend.registerStringInterpolation(mapping);
+    backend.registerStringInterpolation(this);
   }
 
   void registerConstantMap() {
-    backend.registerConstantMap(mapping);
+    backend.registerConstantMap(this);
   }
 
   void registerFallThroughError() {
-    backend.registerFallThroughError(mapping);
+    backend.registerFallThroughError(this);
   }
 
   void registerCatchStatement() {
-    backend.registerCatchStatement(world, mapping);
+    backend.registerCatchStatement(world, this);
   }
 
   void registerStackTraceInCatch() {
-    backend.registerStackTraceInCatch(mapping);
+    backend.registerStackTraceInCatch(this);
   }
 
   ClassElement defaultSuperclass(ClassElement element) {
@@ -327,6 +327,12 @@
   }
 
   void registerThrowExpression() {
-    backend.registerThrowExpression(mapping);
+    backend.registerThrowExpression(this);
   }
+
+  void registerDependency(Element element) {
+    mapping.registerDependency(element);
+  }
+
+  Setlet<Element> get otherDependencies => mapping.otherDependencies;
 }
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index dafeb03..889590c 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -898,7 +898,7 @@
     NodeList typeParameters = popNode();
     Identifier name = popNode();
     int id = idGenerator();
-    ClassElement element = new PartialClassElement(
+    PartialClassElement element = new PartialClassElement(
         name.source, beginToken, endToken, compilationUnitElement, id);
     element.nativeTagInfo = nativeTagInfo;
     pushElement(element);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 6a57a39..162d7a8 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -64,8 +64,8 @@
             // This ensures the default value will be computed.
             Constant constant =
                 backend.constants.getConstantForVariable(parameter);
-            backend.registerCompileTimeConstant(constant, work.resolutionTree);
-            backend.constants.addCompileTimeConstantForEmission(constant);
+            CodegenRegistry registry = work.registry;
+            registry.registerCompileTimeConstant(constant);
           });
         }
         if (compiler.tracer.enabled) {
@@ -991,6 +991,8 @@
     sourceElementStack.add(work.element);
   }
 
+  CodegenRegistry get registry => work.registry;
+
   Element get sourceElement => sourceElementStack.last;
 
   HBasicBlock addNewBlock() {
@@ -1174,6 +1176,9 @@
                        Selector selector,
                        List<HInstruction> providedArguments,
                        ast.Node currentNode) {
+    // TODO(johnniwinther): Register this on the [registry]. Currently the
+    // [CodegenRegistry] calls the enqueuer, but [element] should _not_ be
+    // enqueued.
     backend.registerStaticUse(element, compiler.enqueuer.codegen);
 
     // Ensure that [element] is an implementation element.
@@ -2228,7 +2233,7 @@
     type = localsHandler.substInContext(type);
     HInstruction other = buildTypeConversion(original, type, kind);
     if (other != original) add(other);
-    compiler.enqueuer.codegen.registerIsCheck(type, work.resolutionTree);
+    registry.registerIsCheck(type);
     return other;
   }
 
@@ -2245,7 +2250,7 @@
                                 messageInstruction];
     HInstruction assertIsSubtype = new HInvokeStatic(
         element, inputs, subtypeInstruction.instructionType);
-    compiler.backend.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
+    registry.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
     add(assertIsSubtype);
   }
 
@@ -2825,10 +2830,11 @@
         nestedClosureData.closureClassElement;
     FunctionElement callElement = nestedClosureData.callElement;
     // TODO(ahe): This should be registered in codegen, not here.
-    compiler.enqueuer.codegen.addToWorkList(callElement);
+    // TODO(johnniwinther): Is [registerStaticUse] equivalent to
+    // [addToWorkList]?
+    registry.registerStaticUse(callElement);
     // TODO(ahe): This should be registered in codegen, not here.
-    compiler.enqueuer.codegen.registerInstantiatedClass(
-        closureClassElement, work.resolutionTree);
+    registry.registerInstantiatedClass(closureClassElement);
 
     List<HInstruction> capturedVariables = <HInstruction>[];
     closureClassElement.forEachMember((_, Element member) {
@@ -2846,8 +2852,7 @@
 
     Element methodElement = nestedClosureData.closureElement;
     if (compiler.backend.methodNeedsRti(methodElement)) {
-      compiler.backend.registerGenericClosure(
-          methodElement, compiler.enqueuer.codegen, work.resolutionTree);
+      registry.registerGenericClosure(methodElement);
     }
   }
 
@@ -3043,8 +3048,7 @@
       // creating an [HStatic].
       push(new HStatic(element.declaration, backend.nonNullType));
       // TODO(ahe): This should be registered in codegen.
-      compiler.enqueuer.codegen.registerGetOfStaticFunction(
-          element.declaration);
+      registry.registerGetOfStaticFunction(element.declaration);
     } else if (Elements.isErroneousElement(element)) {
       // An erroneous element indicates an unresolved static getter.
       generateThrowNoSuchMethod(send,
@@ -3573,7 +3577,7 @@
           '"$name" does not handle closure with optional parameters.');
     }
 
-    compiler.enqueuer.codegen.registerStaticUse(element);
+    registry.registerStaticUse(element);
     push(new HForeign(js.js.expressionTemplateYielding(
                           backend.namer.elementAccess(element)),
                       backend.dynamicType,
@@ -3733,7 +3737,7 @@
       // class is _not_ the default implementation from [Object], in
       // case the [noSuchMethod] implementation calls
       // [JSInvocationMirror._invokeOn].
-      compiler.enqueuer.codegen.registerSelectorUse(selector.asUntyped);
+      registry.registerSelectorUse(selector.asUntyped);
     }
     String publicName = name;
     if (selector.isSetter) publicName += '=';
@@ -3953,7 +3957,7 @@
       inputs.add(analyzeTypeArgument(argument));
     });
     // TODO(15489): Register at codegen.
-    compiler.enqueuer.codegen.registerInstantiatedType(type, elements);
+    registry.registerInstantiatedType(type);
     return callSetRuntimeTypeInfo(type.element, inputs, newObject);
   }
 
@@ -4080,7 +4084,7 @@
 
     if (constructor.isFactoryConstructor &&
         !expectedType.typeArguments.isEmpty) {
-      compiler.enqueuer.codegen.registerFactoryWithTypeArguments(elements);
+      registry.registerFactoryWithTypeArguments();
     }
 
     TypeMask elementType = computeType(constructor);
@@ -4433,7 +4437,7 @@
         ConstructedConstant symbol = getConstantForNode(node);
         StringConstant stringConstant = symbol.fields.single;
         String nameString = stringConstant.toDartString().slowToString();
-        compiler.enqueuer.codegen.registerConstSymbol(nameString, elements);
+        registry.registerConstSymbol(nameString);
       }
     } else {
       handleNewSend(node);
@@ -4757,8 +4761,7 @@
 
   void visitLiteralSymbol(ast.LiteralSymbol node) {
     stack.add(addConstant(node));
-    compiler.enqueuer.codegen.registerConstSymbol(
-        node.slowNameString, elements);
+    registry.registerConstSymbol(node.slowNameString);
   }
 
   void visitStringJuxtaposition(ast.StringJuxtaposition node) {
@@ -4921,7 +4924,7 @@
       arguments.add(analyzeTypeArgument(argument));
     }
     // TODO(15489): Register at codegen.
-    compiler.enqueuer.codegen.registerInstantiatedType(type, elements);
+    registry.registerInstantiatedType(type);
     return callSetRuntimeTypeInfo(type.element, arguments, object);
   }
 
@@ -5163,7 +5166,7 @@
     expectedType = localsHandler.substInContext(expectedType);
 
     if (constructor.isFactoryConstructor) {
-      compiler.enqueuer.codegen.registerFactoryWithTypeArguments(elements);
+      registry.registerFactoryWithTypeArguments();
     }
 
     ClassElement cls = constructor.enclosingClass;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 021b088..baea02a 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -170,7 +170,7 @@
 
   Compiler get compiler => backend.compiler;
   NativeEmitter get nativeEmitter => backend.emitter.nativeEmitter;
-  CodegenEnqueuer get world => backend.compiler.enqueuer.codegen;
+  CodegenRegistry get registry => work.registry;
 
   bool isGenerateAtUseSite(HInstruction instruction) {
     return generateAtUseSite.contains(instruction);
@@ -723,7 +723,7 @@
     if (info.catchBlock != null) {
       void register(ClassElement classElement) {
         if (classElement != null) {
-          world.registerInstantiatedClass(classElement, work.resolutionTree);
+          registry.registerInstantiatedClass(classElement);
         }
       }
       register(backend.jsPlainJavaScriptObjectClass);
@@ -1465,7 +1465,7 @@
   }
 
   void visitInterceptor(HInterceptor node) {
-    backend.registerSpecializedGetInterceptor(node.interceptedClasses);
+    registry.registerSpecializedGetInterceptor(node.interceptedClasses);
     String name = backend.namer.getInterceptorName(
         backend.getInterceptorMethod, node.interceptedClasses);
     var isolate = new js.VariableUse(
@@ -1473,7 +1473,7 @@
     use(node.receiver);
     List<js.Expression> arguments = <js.Expression>[pop()];
     push(jsPropertyCall(isolate, name, arguments), node);
-    backend.registerUseInterceptor(world);
+    registry.registerUseInterceptor();
   }
 
   visitInvokeDynamicMethod(HInvokeDynamicMethod node) {
@@ -1493,8 +1493,7 @@
         methodName = 'split';
         // Split returns a List, so we make sure the backend knows the
         // list class is instantiated.
-        world.registerInstantiatedClass(
-            compiler.listClass, work.resolutionTree);
+        registry.registerInstantiatedClass(compiler.listClass);
       } else if (target.isNative && target.isFunction
                  && !node.isInterceptedCall) {
         // A direct (i.e. non-interceptor) native call is the result of
@@ -1517,7 +1516,7 @@
     String methodName = backend.namer.getNameOfInstanceMember(node.element);
     List<js.Expression> arguments = visitArguments(node.inputs);
     push(jsPropertyCall(object, methodName, arguments), node);
-    world.registerStaticUse(node.element);
+    registry.registerStaticUse(node.element);
   }
 
   void visitOneShotInterceptor(HOneShotInterceptor node) {
@@ -1534,7 +1533,7 @@
     } else {
       registerMethodInvoke(node);
     }
-    backend.registerUseInterceptor(world);
+    registry.registerUseInterceptor();
   }
 
   Selector getOptimizedSelectorFor(HInvokeDynamic node, Selector selector) {
@@ -1564,19 +1563,19 @@
       // may know something about the types of closures that need
       // the specific closure call method.
       Selector call = new Selector.callClosureFrom(selector);
-      world.registerDynamicInvocation(call);
+      registry.registerDynamicInvocation(call);
     }
-    world.registerDynamicInvocation(selector);
+    registry.registerDynamicInvocation(selector);
   }
 
   void registerSetter(HInvokeDynamic node) {
     Selector selector = getOptimizedSelectorFor(node, node.selector);
-    world.registerDynamicSetter(selector);
+    registry.registerDynamicSetter(selector);
   }
 
   void registerGetter(HInvokeDynamic node) {
     Selector selector = getOptimizedSelectorFor(node, node.selector);
-    world.registerDynamicGetter(selector);
+    registry.registerDynamicGetter(selector);
   }
 
   visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
@@ -1600,7 +1599,7 @@
                         backend.namer.invocationName(call),
                         visitArguments(node.inputs)),
          node);
-    world.registerDynamicInvocation(call);
+    registry.registerDynamicInvocation(call);
   }
 
   visitInvokeStatic(HInvokeStatic node) {
@@ -1608,11 +1607,11 @@
     ClassElement cls = element.enclosingClass;
     List<DartType> instantiatedTypes = node.instantiatedTypes;
 
-    world.registerStaticUse(element);
+    registry.registerStaticUse(element);
 
     if (instantiatedTypes != null && !instantiatedTypes.isEmpty) {
       instantiatedTypes.forEach((type) {
-        world.registerInstantiatedType(type, work.resolutionTree);
+        registry.registerInstantiatedType(type);
       });
     }
 
@@ -1622,7 +1621,7 @@
 
   visitInvokeSuper(HInvokeSuper node) {
     Element superMethod = node.element;
-    world.registerStaticUse(superMethod);
+    registry.registerStaticUse(superMethod);
     ClassElement superClass = superMethod.enclosingClass;
     if (superMethod.kind == ElementKind.FIELD) {
       String fieldName = backend.namer.instanceFieldPropertyName(superMethod);
@@ -1646,8 +1645,8 @@
         selector = new TypedSelector(receiverType, selector);
         // TODO(floitsch): we know the target. We shouldn't register a
         // dynamic getter.
-        world.registerDynamicGetter(selector);
-        world.registerGetterForSuperMethod(node.element);
+        registry.registerDynamicGetter(selector);
+        registry.registerGetterForSuperMethod(node.element);
         methodName = backend.namer.invocationName(selector);
       } else {
         methodName = backend.namer.getNameOfInstanceMember(superMethod);
@@ -1676,13 +1675,13 @@
     } else {
       String name = backend.namer.instanceFieldPropertyName(element);
       push(new js.PropertyAccess.field(pop(), name), node);
-      world.registerFieldGetter(element);
+      registry.registerFieldGetter(element);
     }
   }
 
   visitFieldSet(HFieldSet node) {
     Element element = node.element;
-    world.registerFieldSetter(element);
+    registry.registerFieldSetter(element);
     String name = backend.namer.instanceFieldPropertyName(element);
     use(node.receiver);
     js.Expression receiver = pop();
@@ -1693,7 +1692,7 @@
 
   visitReadModifyWrite(HReadModifyWrite node) {
     Element element = node.element;
-    world.registerFieldSetter(element);
+    registry.registerFieldSetter(element);
     String name = backend.namer.instanceFieldPropertyName(element);
     use(node.receiver);
     js.Expression fieldReference = new js.PropertyAccess.field(pop(), name);
@@ -1721,7 +1720,7 @@
     if (nativeBehavior == null) return;
     nativeBehavior.typesReturned.forEach((type) {
       if (type is DartType) {
-        world.registerInstantiatedType(type, work.resolutionTree);
+        registry.registerInstantiatedType(type);
       }
     });
   }
@@ -1757,7 +1756,7 @@
       return;
     }
     node.instantiatedTypes.forEach((type) {
-      world.registerInstantiatedType(type, work.resolutionTree);
+      registry.registerInstantiatedType(type);
     });
   }
 
@@ -1773,7 +1772,7 @@
   void generateConstant(Constant constant) {
     if (constant.isFunction) {
       FunctionConstant function = constant;
-      world.registerStaticUse(function.element);
+      registry.registerStaticUse(function.element);
     }
     if (constant.isType) {
       // If the type is a web component, we need to ensure the constructors are
@@ -1781,7 +1780,7 @@
       TypeConstant type = constant;
       Element element = type.representedType.element;
       if (element != null && element.isClass) {
-        backend.customElementsAnalysis.registerTypeConstant(element, world);
+        registry.registerTypeConstant(element);
       }
     }
     push(backend.emitter.constantReference(constant));
@@ -1791,7 +1790,7 @@
     assert(isGenerateAtUseSite(node));
     generateConstant(node.constant);
 
-    backend.registerCompileTimeConstant(node.constant, work.resolutionTree);
+    registry.registerCompileTimeConstant(node.constant);
     backend.constants.addCompileTimeConstantForEmission(node.constant);
   }
 
@@ -1986,7 +1985,7 @@
 
   void generateThrowWithHelper(String helperName, argument) {
     Element helper = compiler.findHelper(helperName);
-    world.registerStaticUse(helper);
+    registry.registerStaticUse(helper);
     js.Expression jsHelper = backend.namer.elementAccess(helper);
     List arguments = [];
     var location;
@@ -2018,7 +2017,7 @@
     use(argument);
 
     Element helper = compiler.findHelper("throwExpression");
-    world.registerStaticUse(helper);
+    registry.registerStaticUse(helper);
 
     js.Expression jsHelper = backend.namer.elementAccess(helper);
     js.Call value = new js.Call(jsHelper, [pop()]);
@@ -2037,12 +2036,12 @@
     } else {
       push(backend.namer.elementAccess(node.element));
     }
-    world.registerStaticUse(element);
+    registry.registerStaticUse(element);
   }
 
   void visitLazyStatic(HLazyStatic node) {
     Element element = node.element;
-    world.registerStaticUse(element);
+    registry.registerStaticUse(element);
     js.Expression lazyGetter =
         backend.namer.isolateLazyInitializerAccess(element);
     js.Call call = new js.Call(lazyGetter, <js.Expression>[]);
@@ -2050,7 +2049,7 @@
   }
 
   void visitStaticStore(HStaticStore node) {
-    world.registerStaticUse(node.element);
+    registry.registerStaticUse(node.element);
     js.Node variable = backend.namer.elementAccess(node.element);
     use(node.inputs[0]);
     push(new js.Assignment(variable, pop()), node);
@@ -2081,7 +2080,7 @@
       }
     } else {
       Element convertToString = backend.getStringInterpolationHelper();
-      world.registerStaticUse(convertToString);
+      registry.registerStaticUse(convertToString);
       js.Expression jsHelper = backend.namer.elementAccess(convertToString);
       use(input);
       push(new js.Call(jsHelper, <js.Expression>[pop()]), node);
@@ -2089,8 +2088,7 @@
   }
 
   void visitLiteralList(HLiteralList node) {
-    world.registerInstantiatedClass(
-        compiler.listClass, work.resolutionTree);
+    registry.registerInstantiatedClass(compiler.listClass);
     generateArrayLiteral(node);
   }
 
@@ -2270,7 +2268,7 @@
   }
 
   void checkTypeViaProperty(HInstruction input, DartType type, bool negative) {
-    world.registerIsCheck(type, work.resolutionTree);
+    registry.registerIsCheck(type);
 
     use(input);
 
@@ -2352,7 +2350,7 @@
 
   void emitIs(HIs node, String relation)  {
     DartType type = node.typeExpression;
-    world.registerIsCheck(type, work.resolutionTree);
+    registry.registerIsCheck(type);
     HInstruction input = node.expression;
 
     // If this is changed to single == there are several places below that must
@@ -2557,10 +2555,9 @@
     if (type.kind == TypeKind.FUNCTION) {
       // TODO(5022): We currently generate $isFunction checks for
       // function types.
-      world.registerIsCheck(
-          compiler.functionClass.rawType, work.resolutionTree);
+      registry.registerIsCheck(compiler.functionClass.rawType);
     }
-    world.registerIsCheck(type, work.resolutionTree);
+    registry.registerIsCheck(type);
 
     CheckedModeHelper helper;
     if (node.isBooleanConversionCheck) {
@@ -2631,7 +2628,7 @@
   void visitReadTypeVariable(HReadTypeVariable node) {
     TypeVariableElement element = node.dartType.element;
     Element helperElement = compiler.findHelper('convertRtiToRuntimeType');
-    world.registerStaticUse(helperElement);
+    registry.registerStaticUse(helperElement);
 
     use(node.inputs[0]);
     if (node.hasReceiver) {
@@ -2683,7 +2680,7 @@
       // For mocked-up tests.
       return js.js('(void 0).$name');
     }
-    world.registerStaticUse(helper);
+    registry.registerStaticUse(helper);
     return backend.namer.elementAccess(helper);
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/util/command_line.dart b/sdk/lib/_internal/compiler/implementation/util/command_line.dart
index 1a938cd..8a32e67 100644
--- a/sdk/lib/_internal/compiler/implementation/util/command_line.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/command_line.dart
@@ -18,7 +18,8 @@
       "\\": "\\",
     };
 
-/// Splits the line similar to how a shell would split arguments.
+/// Splits the line similar to how a shell would split arguments. If [windows]
+/// is `true` escapes will be handled like on the Windows command-line.
 ///
 /// Example:
 ///
@@ -26,7 +27,7 @@
 ///     // --args
 ///     // abc
 ///     // with " 'spaces
-List<String> splitLine(String line) {
+List<String> splitLine(String line, {bool windows: false}) {
   List<String> result = <String>[];
   bool inQuotes = false;
   String openingQuote;
@@ -37,7 +38,7 @@
       inQuotes = false;
       continue;
     }
-    if (!inQuotes && (c == "'" || c == '"')) {
+    if (!inQuotes && (c == '"' || (c == "'" && !windows))) {
       inQuotes = true;
       openingQuote = c;
       continue;
@@ -46,13 +47,22 @@
       if (i == line.length - 1) {
         throw new FormatException("Unfinished escape: $line");
       }
-      i++;
+      if (windows) {
+        String next = line[i+1];
+        if (next == '"' || next == r'\') {
+          buffer.write(next);
+          i++;
+          continue;
+        }
+      } else {
+        i++;
 
-      c = line[i];
-      String mapped = ESCAPE_MAPPING[c];
-      if (mapped == null) mapped = c;
-      buffer.write(mapped);
-      continue;
+        c = line[i];
+        String mapped = ESCAPE_MAPPING[c];
+        if (mapped == null) mapped = c;
+        buffer.write(mapped);
+        continue;
+      }
     }
     if (!inQuotes && c == " ") {
       if (buffer.isNotEmpty) result.add(buffer.toString());
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index 4b260f6..ae56485 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -277,9 +277,9 @@
     return elementsThatCannotThrow.contains(element);
   }
 
-  void registerImplicitSuperCall(TreeElements elements,
+  void registerImplicitSuperCall(Registry registry,
                                  FunctionElement superConstructor) {
-    elements.otherDependencies.add(superConstructor);
+    registry.registerDependency(superConstructor);
   }
 
   void registerMightBePassedToApply(Element element) {
diff --git a/sdk/lib/_internal/lib/io_patch.dart b/sdk/lib/_internal/lib/io_patch.dart
index 6e0821a..289fcc1 100644
--- a/sdk/lib/_internal/lib/io_patch.dart
+++ b/sdk/lib/_internal/lib/io_patch.dart
@@ -104,6 +104,9 @@
   patch static int _close(int id) {
     throw new UnsupportedError("RandomAccessFile._close");
   }
+  patch static int _getFD(int id) {
+    throw new UnsupportedError("RandomAccessFile._getFD");
+  }
   patch static _readByte(int id) {
     throw new UnsupportedError("RandomAccessFile._readByte");
   }
diff --git a/sdk/lib/_internal/lib/isolate_helper.dart b/sdk/lib/_internal/lib/isolate_helper.dart
index cfb0a96..06176b2 100644
--- a/sdk/lib/_internal/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/lib/isolate_helper.dart
@@ -683,6 +683,7 @@
 }
 
 const String _SPAWNED_SIGNAL = "spawned";
+const String _SPAWN_FAILED_SIGNAL = "spawn failed";
 
 var globalThis = Primitives.computeGlobalThis();
 var globalWindow = JS('', "#.window", globalThis);
@@ -802,10 +803,14 @@
         _globalState.topEventLoop.run();
         break;
       case 'spawn-worker':
-        _spawnWorker(msg['functionName'], msg['uri'],
-                     msg['args'], msg['msg'],
-                     msg['isSpawnUri'], msg['startPaused'],
-                     msg['replyPort']);
+        var replyPort = msg['replyPort'];
+        spawn(msg['functionName'], msg['uri'],
+              msg['args'], msg['msg'],
+              false, msg['isSpawnUri'], msg['startPaused']).then((msg) {
+          replyPort.send(msg);
+        }, onError: (String errorMessage) {
+          replyPort.send([_SPAWN_FAILED_SIGNAL, errorMessage]);
+        });
         break;
       case 'message':
         SendPort port = msg['port'];
@@ -905,22 +910,28 @@
     if (uri != null && uri.endsWith(".dart")) uri += ".js";
 
     ReceivePort port = new ReceivePort();
-    Future<List> result = port.first.then((msg) {
-      assert(msg[0] == _SPAWNED_SIGNAL);
-      return msg;
+    Completer<List> completer = new Completer();
+    port.first.then((msg) {
+      if (msg[0] == _SPAWNED_SIGNAL) {
+        completer.complete(msg);
+      } else {
+        assert(msg[0] == _SPAWN_FAILED_SIGNAL);
+        completer.completeError(msg[1]);
+      }
     });
 
     SendPort signalReply = port.sendPort;
 
     if (_globalState.useWorkers && !isLight) {
-      _startWorker(functionName, uri, args, message, isSpawnUri, startPaused,
-                   signalReply);
+      _startWorker(
+          functionName, uri, args, message, isSpawnUri, startPaused,
+          signalReply, (String message) => completer.completeError(message));
     } else {
       _startNonWorker(
           functionName, uri, args, message, isSpawnUri, startPaused,
           signalReply);
     }
-    return result;
+    return completer.future;
   }
 
   static void _startWorker(
@@ -928,7 +939,8 @@
       List<String> args, message,
       bool isSpawnUri,
       bool startPaused,
-      SendPort replyPort) {
+      SendPort replyPort,
+      void onError(String message)) {
     if (_globalState.isWorker) {
       _globalState.mainManager.postMessage(_serializeMessage({
           'command': 'spawn-worker',
@@ -941,7 +953,7 @@
           'replyPort': replyPort}));
     } else {
       _spawnWorker(functionName, uri, args, message,
-                   isSpawnUri, startPaused, replyPort);
+                   isSpawnUri, startPaused, replyPort, onError);
     }
   }
 
@@ -1007,14 +1019,38 @@
                            List<String> args, message,
                            bool isSpawnUri,
                            bool startPaused,
-                           SendPort replyPort) {
+                           SendPort replyPort,
+                           void onError(String message)) {
     if (uri == null) uri = thisScript;
     final worker = JS('var', 'new Worker(#)', uri);
+    // Trampolines are used when wanting to call a Dart closure from
+    // JavaScript.  The helper function DART_CLOSURE_TO_JS only accepts
+    // top-level or static methods, and the trampoline allows us to capture
+    // arguments and values which can be passed to a static method.
+    final onerrorTrampoline = JS(
+        '',
+        '''
+(function (f, u, c) {
+  return function(e) {
+    return f(e, u, c)
+  }
+})(#, #, #)''',
+        DART_CLOSURE_TO_JS(workerOnError), uri, onError);
+    JS('void', '#.onerror = #', worker, onerrorTrampoline);
 
-    var processWorkerMessageTrampoline =
-      JS('', "(function (f, a) { return function (e) { f(a, e); }})(#, #)",
-         DART_CLOSURE_TO_JS(_processWorkerMessage),
-         worker);
+    var processWorkerMessageTrampoline = JS(
+        '',
+        """
+(function (f, a) {
+  return function (e) {
+    // We can stop listening for errors when the first message is received as
+    // we only listen for messages to determine if the uri was bad.
+    e.onerror = null;
+    return f(a, e);
+  }
+})(#, #)""",
+        DART_CLOSURE_TO_JS(_processWorkerMessage),
+        worker);
     JS('void', '#.onmessage = #', worker, processWorkerMessageTrampoline);
     var workerId = _globalState.nextManagerId++;
     // We also store the id on the worker itself so that we can unregister it.
@@ -1034,6 +1070,25 @@
         'startPaused': startPaused,
         'functionName': functionName }));
   }
+
+  static bool workerOnError(
+      /* Event */ event,
+      String uri,
+      void onError(String message)) {
+    // Attempt to shut up the browser, as the error has been handled.  Chrome
+    // ignores this :-(
+    JS('void', '#.preventDefault()', event);
+    String message = JS('String|Null', '#.message', event);
+    if (message == null) {
+      // Some browsers, including Chrome, fail to provide a proper error
+      // event.
+      message = 'Error spawning worker for $uri';
+    } else {
+      message = 'Error spawning worker for $uri ($message)';
+    }
+    onError(message);
+    return true;
+  }
 }
 
 /********************************************************
diff --git a/sdk/lib/_internal/lib/isolate_patch.dart b/sdk/lib/_internal/lib/isolate_patch.dart
index 4959a0d..78a8ca9 100644
--- a/sdk/lib/_internal/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/lib/isolate_patch.dart
@@ -44,6 +44,71 @@
       return new Future<Isolate>.error(e, st);
     }
   }
+
+  patch void _pause(Capability resumeCapability) {
+    var message = new List(3)
+        ..[0] = "pause"
+        ..[1] = pauseCapability
+        ..[2] = resumeCapability;
+    controlPort.send(message);
+  }
+
+  patch void resume(Capability resumeCapability) {
+    var message = new List(2)
+        ..[0] = "resume"
+        ..[1] = resumeCapability;
+    controlPort.send(message);
+  }
+
+  patch void addOnExitListener(SendPort responsePort) {
+    // TODO(lrn): Can we have an internal method that checks if the receiving
+    // isolate of a SendPort is still alive?
+    var message = new List(2)
+        ..[0] = "add-ondone"
+        ..[1] = responsePort;
+    controlPort.send(message);
+  }
+
+  patch void removeOnExitListener(SendPort responsePort) {
+    var message = new List(2)
+        ..[0] = "remove-ondone"
+        ..[1] = responsePort;
+    controlPort.send(message);
+  }
+
+  patch void setErrorsFatal(bool errorsAreFatal) {
+    var message = new List(3)
+        ..[0] = "set-errors-fatal"
+        ..[1] = terminateCapability
+        ..[2] = errorsAreFatal;
+    controlPort.send(message);
+  }
+
+  patch void kill([int priority = BEFORE_NEXT_EVENT]) {
+    controlPort.send(["kill", terminateCapability, priority]);
+  }
+
+  patch void ping(SendPort responsePort, [int pingType = IMMEDIATE]) {
+    var message = new List(3)
+        ..[0] = "ping"
+        ..[1] = responsePort
+        ..[2] = pingType;
+    controlPort.send(message);
+  }
+
+  patch void addErrorListener(SendPort port) {
+    var message = new List(2)
+        ..[0] = "getErrors"
+        ..[1] = port;
+    controlPort.send(message);
+  }
+
+  patch void removeErrorListener(SendPort port) {
+    var message = new List(2)
+        ..[0] = "stopErrors"
+        ..[1] = port;
+    controlPort.send(message);
+  }
 }
 
 /** Default factory for receive ports. */
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index dca0d98..9a58097 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -1038,16 +1038,13 @@
   }
 
   InstanceMirror getField(Symbol fieldName) {
-    // BUG(16400): This should be a labelled block, but that makes
-    // dart2js crash when merging locals information in the type
-    // inferencing implementation.
-    do {
+    FASTPATH: {
       var cache = _getterCache;
-      if (isMissingCache(cache) || isMissingProbe(fieldName)) break;
+      if (isMissingCache(cache) || isMissingProbe(fieldName)) break FASTPATH;
       // If the [fieldName] has an associated probe function, we can use
       // it to read from the getter cache specific to this [InstanceMirror].
       var getter = JS('', '#.\$p(#)', fieldName, cache);
-      if (isUndefined(getter)) break;
+      if (isUndefined(getter)) break FASTPATH;
       // Call the getter passing the reflectee as the first argument.
       var value = JS('', '#(#)', getter, reflectee);
       // The getter has an associate cache of the last [InstanceMirror]
@@ -1062,7 +1059,7 @@
         JS('void', '#.m = #', getter, result);
         return result;
       }
-    } while (false);
+    }
     return _getFieldSlow(fieldName);
   }
 
@@ -2188,11 +2185,6 @@
 
   // TODO(ahe): Implement this method.
   String get source => throw new UnimplementedError();
-
-  // TODO(ahe): Implement this method.
-  InstanceMirror findInContext(Symbol name, {ifAbsent: null}) {
-    throw new UnsupportedError("ClosureMirror.findInContext not yet supported");
-  }
 }
 
 class JsMethodMirror extends JsDeclarationMirror implements MethodMirror {
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
index e71a016..901a079 100644
--- a/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
@@ -10,7 +10,6 @@
 import 'package:barback/barback.dart';
 
 import '../serialize.dart';
-import '../utils.dart';
 import 'transform.dart';
 
 /// Converts [transformer] into a serializable map.
diff --git a/sdk/lib/_internal/pub/lib/src/barback.dart b/sdk/lib/_internal/pub/lib/src/barback.dart
index fb25742..af5e0c4 100644
--- a/sdk/lib/_internal/pub/lib/src/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback.dart
@@ -34,7 +34,7 @@
 /// constraint and barback's version.
 ///
 /// [compat]: https://gist.github.com/nex3/10942218
-final supportedVersions = new VersionConstraint.parse(">=0.13.0 <0.14.1");
+final supportedVersions = new VersionConstraint.parse(">=0.13.0 <0.14.2");
 
 /// A list of the names of all built-in transformers that pub exposes.
 const _BUILT_IN_TRANSFORMERS = const ['\$dart2js'];
@@ -204,18 +204,13 @@
   return new Uri(scheme: 'package', path: id.path.replaceFirst('lib/', ''));
 }
 
-/// Converts [uri] into an [AssetId] if its path is within "packages" or
-/// "assets".
-///
-/// While "packages" can appear anywhere in the path, "assets" is only allowed
-/// as the top-level directory. (This throws a [FormatException] if "assets"
-/// appears anywhere else.)
+/// Converts [uri] into an [AssetId] if its path is within "packages".
 ///
 /// If the URL contains a special directory, but lacks a following package name,
 /// throws a [FormatException].
 ///
 /// If the URI doesn't contain one of those special directories, returns null.
-AssetId specialUrlToId(Uri url) {
+AssetId packagesUrlToId(Uri url) {
   var parts = path.url.split(url.path);
 
   // Strip the leading "/" from the URL.
@@ -223,20 +218,7 @@
 
   if (parts.isEmpty) return null;
 
-  // Check for "assets" at the beginning of the URL.
-  if (parts.first == "assets") {
-    if (parts.length <= 1) {
-      throw new FormatException(
-          'Invalid URL path "${url.path}". Expected package name after '
-          '"assets".');
-    }
-
-    var package = parts[1];
-    var assetPath = path.url.join("asset", path.url.joinAll(parts.skip(2)));
-    return new AssetId(package, assetPath);
-  }
-
-  // Check for "packages" anywhere in the URL.
+  // Check for "packages" in the URL.
   // TODO(rnystrom): If we rewrite "package:" imports to relative imports that
   // point to a canonical "packages" directory, we can limit "packages" to the
   // root of the URL as well. See: #16649.
diff --git a/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart b/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart
index f31d4d2..80603b1 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart
@@ -7,6 +7,9 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:http_parser/http_parser.dart';
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf_web_socket/shelf_web_socket.dart';
 import 'package:stack_trace/stack_trace.dart';
 
 import '../log.dart' as log;
@@ -19,7 +22,9 @@
 // See #16954.
 class AdminServer extends BaseServer {
   /// All currently open [WebSocket] connections.
-  final _webSockets = new Set<WebSocket>();
+  final _webSockets = new Set<CompatibleWebSocket>();
+
+  shelf.Handler _handler;
 
   /// Creates a new server and binds it to [port] of [host].
   static Future<AdminServer> bind(AssetEnvironment environment,
@@ -31,7 +36,11 @@
   }
 
   AdminServer._(AssetEnvironment environment, HttpServer server)
-      : super(environment, server);
+      : super(environment, server) {
+    _handler = new shelf.Cascade()
+        .add(webSocketHandler(_handleWebSocket))
+        .add(_handleHttp).handler;
+  }
 
   /// Closes the server and all Web Socket connections.
   Future close() {
@@ -40,33 +49,23 @@
     return Future.wait(futures);
   }
 
-  /// Handles an HTTP request.
-  void handleRequest(HttpRequest request) {
-    if (WebSocketTransformer.isUpgradeRequest(request)) {
-      _handleWebSocket(request);
-      return;
-    }
+  handleRequest(shelf.Request request) => _handler(request);
 
+  /// Handles an HTTP request.
+  _handleHttp(shelf.Request request) {
     // TODO(rnystrom): Actually respond to requests once there is an admin
     // interface. See #16954.
     logRequest(request, "501 Not Implemented");
-    request.response.headers.contentType =
-        ContentType.parse("text/plain; charset=utf-8");
-
-    request.response.statusCode = 501;
-    request.response.reasonPhrase = "Not Implemented";
-    request.response.write(
-        "Currently this server only accepts Web Socket connections.");
-    request.response.close();
+    return new shelf.Response(501,
+        body: "Currently this server only accepts Web Socket connections.");
   }
 
   /// Creates a web socket for [request] which should be an upgrade request.
-  void _handleWebSocket(HttpRequest request) {
-    Chain.track(WebSocketTransformer.upgrade(request)).then((socket) {
-      _webSockets.add(socket);
-      var api = new WebSocketApi(socket, environment);
-
-      return api.listen().whenComplete(() => _webSockets.remove(api));
-    }).catchError(addError);
+  void _handleWebSocket(CompatibleWebSocket socket) {
+    _webSockets.add(socket);
+    var api = new WebSocketApi(socket, environment);
+    api.listen()
+        .whenComplete(() => _webSockets.remove(api))
+        .catchError(addError);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
index f097e9f..cea9ca2 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
@@ -570,7 +570,7 @@
       // 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;
+      if (parts.contains("packages")) return;
 
       // Skip files that were (most likely) compiled from nearby ".dart"
       // files. These are created by the Editor's "Run as JavaScript"
diff --git a/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart b/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
index 413f929..d53d3ea 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
@@ -10,6 +10,7 @@
 import 'package:barback/barback.dart';
 import 'package:mime/mime.dart';
 import 'package:path/path.dart' as path;
+import 'package:shelf/shelf.dart' as shelf;
 import 'package:stack_trace/stack_trace.dart';
 
 import '../barback.dart';
@@ -27,8 +28,7 @@
   /// 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.
+  /// served and only assets in "lib" directories are available.
   final String rootDirectory;
 
   /// Optional callback to determine if an asset should be served.
@@ -60,7 +60,7 @@
   /// requested from barback.
   AssetId urlToId(Uri url) {
     // See if it's a URL to a public directory in a dependency.
-    var id = specialUrlToId(url);
+    var id = packagesUrlToId(url);
     if (id != null) return id;
 
     if (rootDirectory == null) {
@@ -79,66 +79,43 @@
   }
 
   /// Handles an HTTP request.
-  void handleRequest(HttpRequest request) {
+  handleRequest(shelf.Request request) {
     if (request.method != "GET" && request.method != "HEAD") {
-      methodNotAllowed(request);
-      return;
+      return methodNotAllowed(request);
     }
 
     var id;
     try {
-      id = urlToId(request.uri);
+      id = urlToId(request.url);
     } on FormatException catch (ex) {
       // If we got here, we had a path like "/packages" which is a special
-      // directory, but not a valid path since it lacks a following package name.
-      notFound(request, error: ex.message);
-      return;
+      // directory, but not a valid path since it lacks a following package
+      // name.
+      return notFound(request, error: ex.message);
     }
 
     // See if the asset should be blocked.
     if (allowAsset != null && !allowAsset(id)) {
-      notFound(request,
+      return notFound(request,
           error: "Asset $id is not available in this configuration.",
           asset: id);
-      return;
-    }
-
-    // TODO(rnystrom): Remove this when #16647 is fixed.
-    // The "assets" path is deprecated so warn if the user is relying on it.
-    // We do this here in pub serve so we only warn if they in fact actually
-    // use an asset from a package's "asset" directory.
-    if (id.path.startsWith("asset/")) {
-      var message = 'Warning: Support for the "asset" directory is deprecated '
-          'and will be removed soon.\n';
-
-      var fixed = id.path.replaceAll(new RegExp(r"^asset/"), "lib/");
-      if (id.package == environment.rootPackage.name) {
-        message += 'Please move "${id.path}" to "$fixed".';
-      } else {
-        message += 'Please ask the maintainer of "${id.package}" to move '
-            '"${id.path}" to "$fixed".';
-      }
-
-      log.warning(log.yellow(message));
     }
 
     logRequest(request, "Loading $id");
-    environment.barback.getAssetById(id).then((result) {
+    return 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) {
-        if (request.uri.path.endsWith('/')) return _serveAsset(request, asset);
+        if (request.url.path.endsWith('/')) return _serveAsset(request, asset);
 
         // We only want to serve index.html if the URL explicitly ends in a
         // slash. For other URLs, we redirect to one with the slash added to
         // implicitly support that too. This follows Apache's behavior.
-        logRequest(request, "302 Redirect to ${request.uri}/");
-        request.response.statusCode = 302;
-        request.response.headers.add('location', '${request.uri}/');
-        request.response.close();
+        logRequest(request, "302 Redirect to ${request.url}/");
+        return new shelf.Response.found('${request.url}/');
       }).catchError((newError, newTrace) {
         // If we find neither the original file or the index, we should report
         // the error about the original to the user.
@@ -151,52 +128,37 @@
 
         addError(error, trace);
         close();
-        return;
+        return new shelf.Response.internalServerError();
       }
 
-      addResult(new BarbackServerResult._failure(request.uri, id, error));
-      notFound(request, asset: id);
+      addResult(new BarbackServerResult._failure(request.url, id, error));
+      return notFound(request, asset: id);
     });
   }
 
-  /// Serves the body of [asset] on [request]'s response stream.
-  ///
-  /// Returns a future that completes when the response has been succesfully
-  /// written.
-  Future _serveAsset(HttpRequest request, Asset asset) {
+  /// Returns the body of [asset] as a response to [request].
+  Future<shelf.Response> _serveAsset(shelf.Request request, Asset asset) {
     return validateStream(asset.read()).then((stream) {
-      addResult(new BarbackServerResult._success(request.uri, asset.id));
+      addResult(new BarbackServerResult._success(request.url, asset.id));
+      var headers = {};
       var mimeType = lookupMimeType(asset.id.path);
-      if (mimeType != null) {
-        request.response.headers.add('content-type', mimeType);
-      }
-      // TODO(rnystrom): Set content-type based on asset type.
-      return Chain.track(request.response.addStream(stream)).then((_) {
-        // Log successful requests both so we can provide debugging
-        // information and so scheduled_test knows we haven't timed out while
-        // loading transformers.
-        logRequest(request, "Served ${asset.id}");
-        request.response.close();
-      });
+      if (mimeType != null) headers['Content-Type'] = mimeType;
+      return new shelf.Response.ok(stream, headers: headers);
     }).catchError((error, trace) {
-      addResult(new BarbackServerResult._failure(request.uri, asset.id, error));
+      addResult(new BarbackServerResult._failure(request.url, asset.id, error));
 
       // If we couldn't read the asset, handle the error gracefully.
       if (error is FileSystemException) {
         // Assume this means the asset was a file-backed source asset
         // and we couldn't read it, so treat it like a missing asset.
-        notFound(request, error: error.toString(), asset: asset.id);
-        return;
+        return notFound(request, error: error.toString(), asset: asset.id);
       }
 
       trace = new Chain.forTrace(trace);
       logRequest(request, "$error\n$trace");
 
       // Otherwise, it's some internal error.
-      request.response.statusCode = 500;
-      request.response.reasonPhrase = "Internal Error";
-      request.response.write(error);
-      request.response.close();
+      return new shelf.Response.internalServerError(body: error.toString());
     });
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/base_server.dart b/sdk/lib/_internal/pub/lib/src/barback/base_server.dart
index 0dcc936..8155921 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/base_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/base_server.dart
@@ -9,6 +9,8 @@
 import 'dart:io';
 
 import 'package:barback/barback.dart';
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as shelf_io;
 import 'package:stack_trace/stack_trace.dart';
 
 import '../log.dart' as log;
@@ -41,10 +43,9 @@
   final _resultsController = new StreamController<T>.broadcast();
 
   BaseServer(this.environment, this._server) {
-    Chain.track(_server).listen(handleRequest, onError: (error, stackTrace) {
-      _resultsController.addError(error, stackTrace);
-      close();
-    });
+    shelf_io.serveRequests(Chain.track(_server), const shelf.Pipeline()
+        .addMiddleware(shelf.createMiddleware(errorHandler: _handleError))
+        .addHandler(handleRequest));
   }
 
   /// Closes this server.
@@ -53,35 +54,27 @@
   }
 
   /// Handles an HTTP request.
-  void handleRequest(HttpRequest request);
+  handleRequest(shelf.Request request);
 
-  /// Responds to [request] with a 405 response and closes it.
-  void methodNotAllowed(HttpRequest request) {
+  /// Returns a 405 response to [request].
+  shelf.Response methodNotAllowed(shelf.Request request) {
     logRequest(request, "405 Method Not Allowed");
-    request.response.statusCode = 405;
-    request.response.reasonPhrase = "Method Not Allowed";
-    request.response.headers.add('Allow', 'GET, HEAD');
-    request.response.write(
-        "The ${request.method} method is not allowed for ${request.uri}.");
-    request.response.close();
+    return new shelf.Response(405,
+        body: "The ${request.method} method is not allowed for ${request.url}.",
+        headers: {'Allow': 'GET, HEAD'});
   }
 
-  /// Responds to [request] with a 404 response and closes it.
+  /// Returns a 404 response to [request].
   ///
   /// If [asset] is given, it is the ID of the asset that couldn't be found.
-  void notFound(HttpRequest request, {String error, AssetId asset}) {
+  shelf.Response notFound(shelf.Request request, {String error,
+      AssetId asset}) {
     logRequest(request, "Not Found");
 
-    // Force a UTF-8 encoding so that error messages in non-English locales are
-    // sent correctly.
-    request.response.headers.contentType =
-        ContentType.parse("text/html; charset=utf-8");
-    request.response.statusCode = 404;
-    request.response.reasonPhrase = "Not Found";
-
     // TODO(rnystrom): Apply some styling to make it visually clear that this
     // error is coming from pub serve itself.
-    request.response.writeln("""
+    var body = new StringBuffer();
+    body.writeln("""
         <!DOCTYPE html>
         <head>
         <title>404 Not Found</title>
@@ -90,24 +83,27 @@
         <h1>404 Not Found</h1>""");
 
     if (asset != null) {
-      request.response.writeln("<p>Could not find asset "
+      body.writeln("<p>Could not find asset "
           "<code>${HTML_ESCAPE.convert(asset.path)}</code> in package "
           "<code>${HTML_ESCAPE.convert(asset.package)}</code>.</p>");
     }
 
     if (error != null) {
-      request.response.writeln("<p>Error: ${HTML_ESCAPE.convert(error)}</p>");
+      body.writeln("<p>Error: ${HTML_ESCAPE.convert(error)}</p>");
     }
 
-    request.response.writeln("""
+    body.writeln("""
         </body>""");
 
-    request.response.close();
+    // Force a UTF-8 encoding so that error messages in non-English locales are
+    // sent correctly.
+    return new shelf.Response.notFound(body.toString(),
+        headers: {'Content-Type': 'text/html; charset=utf-8'});
   }
 
   /// Log [message] at [log.Level.FINE] with metadata about [request].
-  void logRequest(HttpRequest request, String message) =>
-    log.fine("$this ${request.method} ${request.uri}\n$message");
+  void logRequest(shelf.Request request, String message) =>
+    log.fine("$this ${request.method} ${request.url}\n$message");
 
   /// Adds [result] to the server's [results] stream.
   void addResult(T result) {
@@ -118,4 +114,11 @@
   void addError(error, [stackTrace]) {
     _resultsController.addError(error, stackTrace);
   }
+
+  /// Handles an error thrown by [handleRequest].
+  _handleError(error, StackTrace stackTrace) {
+    _resultsController.addError(error, stackTrace);
+    close();
+    return new shelf.Response.internalServerError();
+  }
 }
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 101669f..b3b1797 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -384,8 +384,8 @@
   }
 
   AssetId _sourceUrlToId(Uri url) {
-    // See if it's a special path with "packages" or "assets" in it.
-    var id = specialUrlToId(url);
+    // See if it's a package path.
+    var id = packagesUrlToId(url);
     if (id != null) return id;
 
     // See if it's a path to a "public" asset within the root package. All
diff --git a/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
index 9182ec6..1892f97 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
@@ -20,6 +20,7 @@
     if (includes == null && excludes == null) return inner;
 
     if (inner is LazyTransformer) {
+      // TODO(nweiz): Remove these unnecessary "as"es when issue 19046 is fixed.
       return new _LazyExcludingTransformer(
           inner as LazyTransformer, includes, excludes);
     } else if (inner is DeclaringTransformer) {
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 6953d7c..7952dcf 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
@@ -7,6 +7,7 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:http_parser/http_parser.dart';
 import 'package:path/path.dart' as path;
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
 
@@ -19,7 +20,7 @@
 /// This is a [JSON-RPC 2.0](http://www.jsonrpc.org/specification) server. Its
 /// methods are described in the method-level documentation below.
 class WebSocketApi {
-  final WebSocket _socket;
+  final CompatibleWebSocket _socket;
   final AssetEnvironment _environment;
   final _server = new json_rpc.Server();
 
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index 560bbe2..ed16ac9 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -124,7 +124,7 @@
 
   /// Writes [asset] to the appropriate build directory.
   ///
-  /// If [asset] is in the special "assets" directory, writes it to every
+  /// If [asset] is in the special "packages" directory, writes it to every
   /// build directory.
   Future _writeAsset(Asset asset) {
     // In release mode, strip out .dart files since all relevant ones have been
@@ -137,8 +137,7 @@
 
     // If the asset is from a public directory, copy it into all of the
     // top-level build directories.
-    if (path.isWithin("assets", destPath) ||
-        path.isWithin("packages", destPath)) {
+    if (path.isWithin("packages", destPath)) {
       return Future.wait(sourceDirectories.map((buildDir) =>
           _writeOutputFile(asset, path.join(buildDir, destPath))));
     }
@@ -156,7 +155,6 @@
   ///     myapp|web/index.html   -> web/index.html
   ///     myapp|lib/lib.dart     -> packages/myapp/lib.dart
   ///     foo|lib/foo.dart       -> packages/foo/foo.dart
-  ///     foo|asset/foo.png      -> assets/foo/foo.png
   ///     myapp|test/main.dart   -> test/main.dart
   ///     foo|test/main.dart     -> ERROR
   ///
@@ -169,16 +167,9 @@
           "Can not build assets from top-level directory.");
     }
 
-    // Map "asset" and "lib" to their shared directories.
-    var dir = parts[0];
-    var rest = parts.skip(1);
-
-    if (dir == "asset") {
-      return path.join("assets", id.package, path.joinAll(rest));
-    }
-
-    if (dir == "lib") {
-      return path.join("packages", id.package, path.joinAll(rest));
+    // Map "lib" to the "packages" directory.
+    if (parts[0] == "lib") {
+      return path.join("packages", id.package, path.joinAll(parts.skip(1)));
     }
 
     // Shouldn't be trying to access non-public directories of other packages.
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index 9cb5d30..d4fa045 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -8,6 +8,9 @@
 [ $runtime == vm && $system == windows ]
 test/serve/warns_on_assets_paths_test: Pass, Fail # Issue 15741
 
+[ $runtime == vm && $system == macos ]
+test/serve/native_watch_modified_file_test: Pass, Fail # Issue 19052
+
 # Pub only runs on the VM, so just rule out all compilers.
 [ $compiler == dart2js || $compiler == dart2dart ]
 *: Skip
diff --git a/sdk/lib/_internal/pub/test/barback/directory_args_test.dart b/sdk/lib/_internal/pub/test/barback/directory_args_test.dart
index 59ce17e..9042690 100644
--- a/sdk/lib/_internal/pub/test/barback/directory_args_test.dart
+++ b/sdk/lib/_internal/pub/test/barback/directory_args_test.dart
@@ -14,7 +14,6 @@
   setUp(() {
     d.dir(appPath, [
       d.appPubspec(),
-      d.dir('asset', [d.file('file.txt', 'asset')]),
       d.dir('bar', [d.file('file.txt', 'bar')]),
       d.dir('foo', [d.file('file.txt', 'foo')]),
       d.dir('test', [d.file('file.txt', 'test')]),
@@ -24,25 +23,15 @@
 
   integration("builds only the given directories", () {
     schedulePub(args: ["build", "foo", "bar"],
-        output: new RegExp(r'Built 4 files to "build".'));
+        output: new RegExp(r'Built 2 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
         d.dir('bar', [
-          d.file('file.txt', 'bar'),
-          d.dir('assets', [
-            d.dir('myapp', [
-              d.file('file.txt', 'asset')
-            ])
-          ])
+          d.file('file.txt', 'bar')
         ]),
         d.dir('foo', [
-          d.file('file.txt', 'foo'),
-          d.dir('assets', [
-            d.dir('myapp', [
-              d.file('file.txt', 'asset')
-            ])
-          ])
+          d.file('file.txt', 'foo')
         ]),
         d.nothing('test'),
         d.nothing('web')
diff --git a/sdk/lib/_internal/pub/test/build/allows_arbitrary_modes_test.dart b/sdk/lib/_internal/pub/test/build/allows_arbitrary_modes_test.dart
index 5138236..98a5d37 100644
--- a/sdk/lib/_internal/pub/test/build/allows_arbitrary_modes_test.dart
+++ b/sdk/lib/_internal/pub/test/build/allows_arbitrary_modes_test.dart
@@ -30,30 +30,32 @@
 
 main() {
   initConfig();
-  integration("allows user-defined mode names", () {
-    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']);
-
-    schedulePub(args: ["build", "--mode", "depeche"]);
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('web', [
-          d.file('foo.out', 'depeche')
+  withBarbackVersions("any", () {
+    integration("allows user-defined mode names", () {
+      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")
         ])
-      ])
-    ]).validate();
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      schedulePub(args: ["build", "--mode", "depeche"]);
+
+      d.dir(appPath, [
+        d.dir('build', [
+          d.dir('web', [
+            d.file('foo.out', 'depeche')
+          ])
+        ])
+      ]).validate();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/build/defaults_to_release_mode_test.dart b/sdk/lib/_internal/pub/test/build/defaults_to_release_mode_test.dart
index a719691..c08e3db 100644
--- a/sdk/lib/_internal/pub/test/build/defaults_to_release_mode_test.dart
+++ b/sdk/lib/_internal/pub/test/build/defaults_to_release_mode_test.dart
@@ -30,30 +30,32 @@
 
 main() {
   initConfig();
-  integration("defaults to release mode", () {
-    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']);
-
-    schedulePub(args: ["build"]);
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('web', [
-          d.file('foo.out', 'release')
+  withBarbackVersions("any", () {
+    integration("defaults to release mode", () {
+      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")
         ])
-      ])
-    ]).validate();
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      schedulePub(args: ["build"]);
+
+      d.dir(appPath, [
+        d.dir('build', [
+          d.dir('web', [
+            d.file('foo.out', 'release')
+          ])
+        ])
+      ]).validate();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/build/handles_long_paths_test.dart b/sdk/lib/_internal/pub/test/build/handles_long_paths_test.dart
index fe9bc0d..3b8b17b 100644
--- a/sdk/lib/_internal/pub/test/build/handles_long_paths_test.dart
+++ b/sdk/lib/_internal/pub/test/build/handles_long_paths_test.dart
@@ -33,7 +33,7 @@
 
     d.dir("some_long_dependency_name", [
       d.libPubspec("foo", "0.0.1"),
-      d.dir("asset", [
+      d.dir("lib", [
         d.file("foo.txt", "foo")
       ])
     ]).create();
@@ -61,7 +61,7 @@
       d.dir('build', [
         d.dir('web', [
           d.file("index.html", "html"),
-          d.dir('assets', [
+          d.dir('packages', [
             d.dir('foo', [
               d.file('foo.txt', 'foo')
             ])
diff --git a/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_in_lib_test.dart b/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_in_lib_test.dart
deleted file mode 100644
index 6661940..0000000
--- a/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_in_lib_test.dart
+++ /dev/null
@@ -1,78 +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 'package:scheduled_test/scheduled_test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("includes assets from the 'lib' directory of dependencies", () {
-    // Dart2js can take a long time to compile dart code, so we increase the
-    // timeout to cope with that.
-    currentSchedule.timeout *= 3;
-
-    d.dir("foo", [
-      d.libPubspec("foo", "0.0.1"),
-      d.dir("lib", [
-        d.file("foo.txt", "foo"),
-        d.dir("sub", [
-          d.file("bar.txt", "bar"),
-        ])
-      ])
-    ]).create();
-
-    d.dir(appPath, [
-      d.appPubspec({
-        "foo": {"path": "../foo"}
-      }),
-      d.dir("example", [
-        d.file("index.html", "html"),
-      ]),
-      d.dir("web", [
-        d.file("index.html", "html"),
-        d.dir("sub", [
-          d.file("index.html", "html")
-        ])
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "--all"],
-        output: new RegExp(r'Built 7 files to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('example', [
-          d.file("index.html", "html"),
-          d.dir('packages', [
-            d.dir('foo', [
-              d.file('foo.txt', 'foo'),
-              d.dir('sub', [
-                d.file('bar.txt', 'bar'),
-              ]),
-            ])
-          ])
-        ]),
-        d.dir('web', [
-          d.file("index.html", "html"),
-          d.dir('packages', [
-            d.dir('foo', [
-              d.file('foo.txt', 'foo'),
-              d.dir('sub', [
-                d.file('bar.txt', 'bar'),
-              ]),
-            ])
-          ]),
-          d.dir("sub", [
-            d.file("index.html", "html"),
-            // "packages" should *only* be created in the top-level directory.
-            d.nothing("packages")
-          ])
-        ])
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_test.dart b/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_test.dart
index 380a115..6661940 100644
--- a/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_test.dart
+++ b/sdk/lib/_internal/pub/test/build/includes_assets_from_dependencies_test.dart
@@ -10,14 +10,14 @@
 main() {
   initConfig();
 
-  integration("includes assets from dependencies", () {
+  integration("includes assets from the 'lib' directory of dependencies", () {
     // Dart2js can take a long time to compile dart code, so we increase the
     // timeout to cope with that.
     currentSchedule.timeout *= 3;
 
     d.dir("foo", [
       d.libPubspec("foo", "0.0.1"),
-      d.dir("asset", [
+      d.dir("lib", [
         d.file("foo.txt", "foo"),
         d.dir("sub", [
           d.file("bar.txt", "bar"),
@@ -47,7 +47,7 @@
       d.dir('build', [
         d.dir('example', [
           d.file("index.html", "html"),
-          d.dir('assets', [
+          d.dir('packages', [
             d.dir('foo', [
               d.file('foo.txt', 'foo'),
               d.dir('sub', [
@@ -58,7 +58,7 @@
         ]),
         d.dir('web', [
           d.file("index.html", "html"),
-          d.dir('assets', [
+          d.dir('packages', [
             d.dir('foo', [
               d.file('foo.txt', 'foo'),
               d.dir('sub', [
@@ -68,8 +68,8 @@
           ]),
           d.dir("sub", [
             d.file("index.html", "html"),
-            // "assets" should *only* be created in the top-level directory.
-            d.nothing("assets")
+            // "packages" should *only* be created in the top-level directory.
+            d.nothing("packages")
           ])
         ])
       ])
diff --git a/sdk/lib/_internal/pub/test/build/outputs_error_to_json_test.dart b/sdk/lib/_internal/pub/test/build/outputs_error_to_json_test.dart
index 074690a..bbd31fd 100644
--- a/sdk/lib/_internal/pub/test/build/outputs_error_to_json_test.dart
+++ b/sdk/lib/_internal/pub/test/build/outputs_error_to_json_test.dart
@@ -26,37 +26,39 @@
 
 main() {
   initConfig();
-  integration("outputs error to JSON in a failed build", () {
-    // Loading transformers takes several seconds, so make sure we don't
-    // timeout.
-    currentSchedule.timeout *= 2;
+  withBarbackVersions("any", () {
+    integration("outputs error to JSON in a failed build", () {
+      // Loading transformers takes several seconds, so make sure we don't
+      // timeout.
+      currentSchedule.timeout *= 2;
 
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp"]
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", TRANSFORMER)
-      ]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", TRANSFORMER)
+        ]),
+        d.dir("web", [
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    schedulePub(args: ["build", "--format", "json"],
-        outputJson: {
-          "buildResult": "failure",
-          "errors": [
-            {
-              "error": startsWith(
-                  "Transform Rewrite on myapp|web/foo.txt threw error: oh no!")
-            }
-          ],
-          "log": []
-        },
-        exitCode: exit_codes.DATA);
+      schedulePub(args: ["build", "--format", "json"],
+          outputJson: {
+            "buildResult": "failure",
+            "errors": [
+              {
+                "error": startsWith("Transform Rewrite on myapp|web/foo.txt "
+                    "threw error: oh no!")
+              }
+            ],
+            "log": []
+          },
+          exitCode: exit_codes.DATA);
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/dart2js/compiles_generated_dart_file_test.dart b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_dart_file_test.dart
index 1c9c3a6..5254847 100644
--- a/sdk/lib/_internal/pub/test/dart2js/compiles_generated_dart_file_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_dart_file_test.dart
@@ -10,28 +10,30 @@
 
 main() {
   initConfig();
-  integration("compiles a generated Dart file to JS", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "version": "0.0.1",
-        "transformers": ["myapp/transformer"]
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer("munge"))
-      ]),
-      d.dir("web", [
-        d.file("main.dart", """
+  withBarbackVersions("any", () {
+    integration("compiles a generated Dart file to JS", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "version": "0.0.1",
+          "transformers": ["myapp/transformer"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer("munge"))
+        ]),
+        d.dir("web", [
+          d.file("main.dart", """
 const TOKEN = "before";
 void main() => print(TOKEN);
 """)
-      ])
-    ]).create();
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("main.dart.js", contains("(before, munge)"));
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("main.dart.js", contains("(before, munge)"));
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart
index e66023d..d64b533 100644
--- a/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart
@@ -11,34 +11,36 @@
 main() {
   // This is a regression test for issue #17198.
   initConfig();
-  integration("compiles a Dart file that imports a generated file to JS "
-      "outside web/", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "version": "0.0.1",
-        "transformers": ["myapp/transformer"]
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer("munge"))
-      ]),
-      d.dir("test", [
-        d.file("main.dart", """
+  withBarbackVersions("any", () {
+    integration("compiles a Dart file that imports a generated file to JS "
+        "outside web/", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "version": "0.0.1",
+          "transformers": ["myapp/transformer"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer("munge"))
+        ]),
+        d.dir("test", [
+          d.file("main.dart", """
 import "other.dart";
 void main() => print(TOKEN);
 """),
-        d.file("other.dart", """
+          d.file("other.dart", """
 library other;
 const TOKEN = "before";
 """)
-      ])
-    ]).create();
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe(args: ["test"]);
-    requestShouldSucceed("main.dart.js", contains("(before, munge)"),
-        root: "test");
-    endPubServe();
+      pubServe(args: ["test"]);
+      requestShouldSucceed("main.dart.js", contains("(before, munge)"),
+          root: "test");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_test.dart b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_test.dart
index 82ef94f..34be15a 100644
--- a/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_test.dart
@@ -10,42 +10,44 @@
 
 main() {
   initConfig();
-  integration("compiles a Dart file that imports a generated file in another "
-              "package to JS", () {
-    d.dir("foo", [
-      d.pubspec({
-        "name": "foo",
-        "version": "0.0.1",
-        "transformers": ["foo/transformer"]
-      }),
-      d.dir("lib", [
-        d.file("foo.dart", """
+  withBarbackVersions("any", () {
+    integration("compiles a Dart file that imports a generated file in another "
+                "package to JS", () {
+      d.dir("foo", [
+        d.pubspec({
+          "name": "foo",
+          "version": "0.0.1",
+          "transformers": ["foo/transformer"]
+        }),
+        d.dir("lib", [
+          d.file("foo.dart", """
 library foo;
 const TOKEN = "before";
 foo() => TOKEN;
 """),
-        d.file("transformer.dart", dartTransformer("munge"))
-      ])
-    ]).create();
+          d.file("transformer.dart", dartTransformer("munge"))
+        ])
+      ]).create();
 
-    d.dir(appPath, [
-      d.appPubspec({
-        "foo": {
-          "path": "../foo"
-        }
-      }),
-      d.dir("web", [
-        d.file("main.dart", """
+      d.dir(appPath, [
+        d.appPubspec({
+          "foo": {
+            "path": "../foo"
+          }
+        }),
+        d.dir("web", [
+          d.file("main.dart", """
 import "package:foo/foo.dart";
 main() => print(foo());
 """)
-      ])
-    ]).create();
+        ])
+      ]).create();
 
-    createLockFile("myapp", sandbox: ["foo"], pkg: ["barback"]);
+      createLockFile("myapp", sandbox: ["foo"], pkg: ["barback"]);
 
-    pubServe();
-    requestShouldSucceed("main.dart.js", contains("(before, munge)"));
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("main.dart.js", contains("(before, munge)"));
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/dart2js/compiles_imported_generated_file_test.dart b/sdk/lib/_internal/pub/test/dart2js/compiles_imported_generated_file_test.dart
index 63191d2..3b76645 100644
--- a/sdk/lib/_internal/pub/test/dart2js/compiles_imported_generated_file_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/compiles_imported_generated_file_test.dart
@@ -10,32 +10,34 @@
 
 main() {
   initConfig();
-  integration("compiles a Dart file that imports a generated file to JS", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "version": "0.0.1",
-        "transformers": ["myapp/transformer"]
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer("munge"))
-      ]),
-      d.dir("web", [
-        d.file("main.dart", """
+  withBarbackVersions("any", () {
+    integration("compiles a Dart file that imports a generated file to JS", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "version": "0.0.1",
+          "transformers": ["myapp/transformer"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer("munge"))
+        ]),
+        d.dir("web", [
+          d.file("main.dart", """
 import "other.dart";
 void main() => print(TOKEN);
 """),
-        d.file("other.dart", """
+          d.file("other.dart", """
 library other;
 const TOKEN = "before";
 """)
-      ])
-    ]).create();
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("main.dart.js", contains("(before, munge)"));
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("main.dart.js", contains("(before, munge)"));
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/dart2js/does_not_compile_until_its_output_is_requested_test.dart b/sdk/lib/_internal/pub/test/dart2js/does_not_compile_until_its_output_is_requested_test.dart
index 03897e0..b67b147 100644
--- a/sdk/lib/_internal/pub/test/dart2js/does_not_compile_until_its_output_is_requested_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/does_not_compile_until_its_output_is_requested_test.dart
@@ -21,8 +21,6 @@
       ])
     ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
-
     var server = pubServe();
     server.stdout.expect("Build completed successfully");
 
diff --git a/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_command_line_options_type_test.dart b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_command_line_options_type_test.dart
index e722cf5..cc69ed6 100644
--- a/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_command_line_options_type_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_command_line_options_type_test.dart
@@ -18,21 +18,16 @@
           }
         }]
       }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])]),
       d.dir("web", [d.file("main.dart", "void main() {}")])
     ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
-
     var server = pubServe();
     // Make a request first to trigger compilation.
     requestShould404("main.dart.js");
     server.stderr.expect(emitsLines(
         'Build error:\n'
         'Transform Dart2JS on myapp|web/main.dart threw error: '
-            'FormatException: Invalid value for \$dart2js.commandLineOptions: '
+            'Invalid value for \$dart2js.commandLineOptions: '
             '"foo" (expected list of strings).'));
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_environment_type_test.dart b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_environment_type_test.dart
index 4e4f8df..27a62da 100644
--- a/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_environment_type_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_environment_type_test.dart
@@ -18,21 +18,16 @@
           }
         }]
       }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])]),
       d.dir("web", [d.file("main.dart", "void main() {}")])
     ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
-
     var server = pubServe();
     // Make a request first to trigger compilation.
     requestShould404("main.dart.js");
     server.stderr.expect(emitsLines(
         'Build error:\n'
         'Transform Dart2JS on myapp|web/main.dart threw error: '
-            'FormatException: Invalid value for \$dart2js.environment: "foo" '
+            'Invalid value for \$dart2js.environment: "foo" '
             '(expected map from strings to strings).'));
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_option_test.dart b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_option_test.dart
index 7d60191..6058aff 100644
--- a/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_option_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_option_test.dart
@@ -15,14 +15,9 @@
         "transformers": [{
           "\$dart2js": {"invalidOption": true}
         }]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])])
+      })
     ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
-
     // TODO(nweiz): This should provide more context about how the option got
     // passed to dart2js. See issue 16008.
     var pub = startPubServe();
diff --git a/sdk/lib/_internal/pub/test/dart2js/doesnt_support_invalid_type_for_boolean_option_test.dart b/sdk/lib/_internal/pub/test/dart2js/doesnt_support_invalid_type_for_boolean_option_test.dart
index e6283c1..a357d4f 100644
--- a/sdk/lib/_internal/pub/test/dart2js/doesnt_support_invalid_type_for_boolean_option_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/doesnt_support_invalid_type_for_boolean_option_test.dart
@@ -18,20 +18,15 @@
           }
         }]
       }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])]),
       d.dir("web", [d.file("main.dart", "void main() {}")])
     ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
-
     var server = pubServe();
     requestShould404("main.dart.js");
     server.stderr.expect(emitsLines(
         'Build error:\n'
         'Transform Dart2JS on myapp|web/main.dart threw error: '
-            'FormatException: Invalid value for \$dart2js.checked: "foo" '
+            'Invalid value for \$dart2js.checked: "foo" '
             '(expected true or false).'));
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/dart2js/minify_configuration_overrides_mode_test.dart b/sdk/lib/_internal/pub/test/dart2js/minify_configuration_overrides_mode_test.dart
index 46e0261..739bd9d 100644
--- a/sdk/lib/_internal/pub/test/dart2js/minify_configuration_overrides_mode_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/minify_configuration_overrides_mode_test.dart
@@ -15,14 +15,9 @@
         "transformers": [{
           "\$dart2js": {"minify": true}
         }]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])])
+      })
     ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
-
     pubServe();
     requestShouldSucceed("main.dart.js", isMinifiedDart2JSOutput);
     endPubServe();
diff --git a/sdk/lib/_internal/pub/test/dart2js/output_can_be_consumed_by_successive_phases.dart b/sdk/lib/_internal/pub/test/dart2js/output_can_be_consumed_by_successive_phases.dart
index 0dd5c17..2c278c5 100644
--- a/sdk/lib/_internal/pub/test/dart2js/output_can_be_consumed_by_successive_phases.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/output_can_be_consumed_by_successive_phases.dart
@@ -28,22 +28,24 @@
 
 main() {
   initConfig();
-  integration("output can be consumed by successive phases", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["\$dart2js", "myapp/src/transformer"]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", JS_REWRITE_TRANSFORMER)
-      ])]),
-      d.dir("web", [d.file("main.dart", "void main() {}")])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("output can be consumed by successive phases", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["\$dart2js", "myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", JS_REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [d.file("main.dart", "void main() {}")])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("main.dart.out", isUnminifiedDart2JSOutput);
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("main.dart.out", isUnminifiedDart2JSOutput);
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/dart2js/supports_valid_options_test.dart b/sdk/lib/_internal/pub/test/dart2js/supports_valid_options_test.dart
index 3f50b21..397cb47 100644
--- a/sdk/lib/_internal/pub/test/dart2js/supports_valid_options_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/supports_valid_options_test.dart
@@ -28,14 +28,9 @@
             "terse": true
           }
         }]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])])
+      })
     ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
-
     // None of these options should be rejected, either by pub or by dart2js.
     pubServe();
     requestShouldSucceed("main.dart.js", isNot(isEmpty));
diff --git a/sdk/lib/_internal/pub/test/lish/utils.dart b/sdk/lib/_internal/pub/test/lish/utils.dart
index ccd998d..00127c1 100644
--- a/sdk/lib/_internal/pub/test/lish/utils.dart
+++ b/sdk/lib/_internal/pub/test/lish/utils.dart
@@ -5,7 +5,6 @@
 library lish.utils;
 
 import 'dart:convert';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
diff --git a/sdk/lib/_internal/pub/test/oauth2/utils.dart b/sdk/lib/_internal/pub/test/oauth2/utils.dart
index fc9b4c5..d69941b 100644
--- a/sdk/lib/_internal/pub/test/oauth2/utils.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/utils.dart
@@ -5,7 +5,6 @@
 library oauth2.utils;
 
 import 'dart:convert';
-import 'dart:io';
 
 import 'package:http/http.dart' as http;
 import 'package:scheduled_test/scheduled_process.dart';
@@ -13,7 +12,6 @@
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:shelf/shelf.dart' as shelf;
 
-import '../../lib/src/io.dart';
 import '../../lib/src/utils.dart';
 
 void authorizePub(ScheduledProcess pub, ScheduledServer server,
diff --git a/sdk/lib/_internal/pub/test/serve/allows_arbitrary_modes_test.dart b/sdk/lib/_internal/pub/test/serve/allows_arbitrary_modes_test.dart
index 7d6be6c..d124a44 100644
--- a/sdk/lib/_internal/pub/test/serve/allows_arbitrary_modes_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/allows_arbitrary_modes_test.dart
@@ -31,24 +31,26 @@
 
 main() {
   initConfig();
-  integration("allows user-defined mode names", () {
-    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();
+  withBarbackVersions("any", () {
+    integration("allows user-defined mode names", () {
+      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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe(args: ["--mode", "depeche"]);
-    requestShouldSucceed("foo.out", "depeche");
-    endPubServe();
+      pubServe(args: ["--mode", "depeche"]);
+      requestShouldSucceed("foo.out", "depeche");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/serve/defaults_to_debug_mode_test.dart b/sdk/lib/_internal/pub/test/serve/defaults_to_debug_mode_test.dart
index 5da9948..f83f405 100644
--- a/sdk/lib/_internal/pub/test/serve/defaults_to_debug_mode_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/defaults_to_debug_mode_test.dart
@@ -31,24 +31,26 @@
 
 main() {
   initConfig();
-  integration("defaults to debug mode", () {
-    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();
+  withBarbackVersions("any", () {
+    integration("defaults to debug mode", () {
+      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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "debug");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.out", "debug");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_crash_if_an_unused_dart_file_has_a_syntax_error_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_crash_if_an_unused_dart_file_has_a_syntax_error_test.dart
index 81d6c00..01ac8f0 100644
--- a/sdk/lib/_internal/pub/test/serve/does_not_crash_if_an_unused_dart_file_has_a_syntax_error_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/does_not_crash_if_an_unused_dart_file_has_a_syntax_error_test.dart
@@ -12,27 +12,29 @@
 
 main() {
   initConfig();
-  integration("doesn't crash if an unused .dart file has a syntax error", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/src/transformer"]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER),
-        d.file("unused.dart", "(*&^#@")
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("doesn't crash if an unused .dart file has a syntax error", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER),
+          d.file("unused.dart", "(*&^#@")
+        ])]),
+        d.dir("web", [
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var server = pubServe();
-    server.stderr.expect("[RewriteImport]:");
-    server.stderr.expect(startsWith("Error in myapp|lib/src/unused.dart:"));
-    requestShouldSucceed("foo.out", "foo.out");
-    endPubServe();
+      var server = pubServe();
+      server.stderr.expect("[RewriteImport]:");
+      server.stderr.expect(startsWith("Error in myapp|lib/src/unused.dart:"));
+      requestShouldSucceed("foo.out", "foo.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/serve/invalid_urls_test.dart b/sdk/lib/_internal/pub/test/serve/invalid_urls_test.dart
index be48245..29c73a1 100644
--- a/sdk/lib/_internal/pub/test/serve/invalid_urls_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/invalid_urls_test.dart
@@ -19,40 +19,26 @@
       d.appPubspec({
         "foo": {"path": "../foo"}
       }),
-      // Make files that map to the special directory names to ensure they
-      // are *not* found.
-      d.dir("asset", [
-        d.file("packages"),
-        d.file("assets")
-      ]),
       d.dir("lib", [
-        d.file("packages"),
-        d.file("assets")
+        // Make a file that maps to the special "packages" directory to ensure
+        // it is *not* found.
+        d.file("packages")
       ]),
       d.dir("web", [
-        d.file("packages"),
-        d.file("assets")
+        d.file("packages")
       ])
     ]).create();
 
     pubGet();
     pubServe();
     requestShould404("packages");
-    requestShould404("assets");
     requestShould404("packages/");
-    requestShould404("assets/");
     requestShould404("packages/myapp");
-    requestShould404("assets/myapp");
     requestShould404("packages/myapp/");
-    requestShould404("assets/myapp/");
     requestShould404("packages/foo");
-    requestShould404("assets/foo");
     requestShould404("packages/foo/");
-    requestShould404("assets/foo/");
     requestShould404("packages/unknown");
-    requestShould404("assets/unknown");
     requestShould404("packages/unknown/");
-    requestShould404("assets/unknown/");
     endPubServe();
   });
 
diff --git a/sdk/lib/_internal/pub/test/serve/serve_from_app_asset_test.dart b/sdk/lib/_internal/pub/test/serve/serve_from_app_asset_test.dart
deleted file mode 100644
index c4913d5..0000000
--- a/sdk/lib/_internal/pub/test/serve/serve_from_app_asset_test.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2013, 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("'assets' URLs look in the app's 'asset' directory", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("asset", [
-        d.file("foo.txt", "foo"),
-        d.dir("sub", [
-          d.file("bar.txt", "bar"),
-        ])
-      ])
-    ]).create();
-
-    pubServe();
-    requestShouldSucceed("assets/myapp/foo.txt", "foo");
-    requestShouldSucceed("assets/myapp/sub/bar.txt", "bar");
-
-    // "assets" cannot be in a subpath of the URL:
-    requestShould404("foo/assets/myapp/foo.txt");
-    requestShould404("a/b/assets/myapp/sub/bar.txt");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart b/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart
deleted file mode 100644
index f026d8a..0000000
--- a/sdk/lib/_internal/pub/test/serve/serve_from_dependency_asset_test.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2013, 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("'assets' URLs look in the dependency's asset directory", () {
-    d.dir("foo", [
-      d.libPubspec("foo", "0.0.1"),
-      d.dir("asset", [
-        d.file("foo.txt", "foo"),
-        d.dir("sub", [
-          d.file("bar.txt", "bar"),
-        ])
-      ])
-    ]).create();
-
-    d.dir(appPath, [
-      d.appPubspec({
-        "foo": {"path": "../foo"}
-      })
-    ]).create();
-
-    pubServe(shouldGetFirst: true);
-    requestShouldSucceed("assets/foo/foo.txt", "foo");
-    requestShouldSucceed("assets/foo/sub/bar.txt", "bar");
-
-    // "assets" cannot be in a subpath of the URL:
-    requestShould404("foo/assets/foo/foo.txt");
-    requestShould404("a/b/assets/foo/sub/bar.txt");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/supports_user_defined_declaring_transformers_test.dart b/sdk/lib/_internal/pub/test/serve/supports_user_defined_declaring_transformers_test.dart
index 20d622b..ccf5fa5 100644
--- a/sdk/lib/_internal/pub/test/serve/supports_user_defined_declaring_transformers_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/supports_user_defined_declaring_transformers_test.dart
@@ -36,36 +36,38 @@
 
 main() {
   initConfig();
-  integration("supports a user-defined declaring transformer", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/src/lazy", "myapp/src/declaring"]
-      }),
-      d.dir("lib", [d.dir("src", [
-        // Include a lazy transformer before the declaring transformer, because
-        // otherwise its behavior is indistinguishable from a normal
-        // transformer.
-        d.file("lazy.dart", LAZY_TRANSFORMER),
-        d.file("declaring.dart", DECLARING_TRANSFORMER)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("supports a user-defined declaring transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/lazy", "myapp/src/declaring"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          // Include a lazy transformer before the declaring transformer,
+          // because otherwise its behavior is indistinguishable from a normal
+          // transformer.
+          d.file("lazy.dart", LAZY_TRANSFORMER),
+          d.file("declaring.dart", DECLARING_TRANSFORMER)
+        ])]),
+        d.dir("web", [
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var server = pubServe();
-    // The build should complete without either transformer logging anything.
-    server.stdout.expect('Build completed successfully');
+      var server = pubServe();
+      // The build should complete without either transformer logging anything.
+      server.stdout.expect('Build completed successfully');
 
-    requestShouldSucceed("foo.final", "foo.out.final");
-    server.stdout.expect(emitsLines(
-        '[Info from LazyRewrite]:\n'
-        'Rewriting myapp|web/foo.txt.\n'
-        '[Info from DeclaringRewrite]:\n'
-        'Rewriting myapp|web/foo.out.'));
-    endPubServe();
+      requestShouldSucceed("foo.final", "foo.out.final");
+      server.stdout.expect(emitsLines(
+          '[Info from LazyRewrite]:\n'
+          'Rewriting myapp|web/foo.txt.\n'
+          '[Info from DeclaringRewrite]:\n'
+          'Rewriting myapp|web/foo.out.'));
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/serve/supports_user_defined_lazy_transformers_test.dart b/sdk/lib/_internal/pub/test/serve/supports_user_defined_lazy_transformers_test.dart
index 6a64b5d..69859f4 100644
--- a/sdk/lib/_internal/pub/test/serve/supports_user_defined_lazy_transformers_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/supports_user_defined_lazy_transformers_test.dart
@@ -10,30 +10,32 @@
 
 main() {
   initConfig();
-  integration("supports a user-defined lazy transformer", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/src/transformer"]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", LAZY_TRANSFORMER)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("supports a user-defined lazy transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", LAZY_TRANSFORMER)
+        ])]),
+        d.dir("web", [
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var server = pubServe();
-    // The build should complete without the transformer logging anything.
-    server.stdout.expect('Build completed successfully');
+      var server = pubServe();
+      // The build should complete without the transformer logging anything.
+      server.stdout.expect('Build completed successfully');
 
-    requestShouldSucceed("foo.out", "foo.out");
-    server.stdout.expect(emitsLines(
-        '[Info from LazyRewrite]:\n'
-        'Rewriting myapp|web/foo.txt.'));
-    endPubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      server.stdout.expect(emitsLines(
+          '[Info from LazyRewrite]:\n'
+          'Rewriting myapp|web/foo.txt.'));
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/serve/warns_on_serve_from_asset_test.dart b/sdk/lib/_internal/pub/test/serve/warns_on_serve_from_asset_test.dart
deleted file mode 100644
index 2f4fc497c..0000000
--- a/sdk/lib/_internal/pub/test/serve/warns_on_serve_from_asset_test.dart
+++ /dev/null
@@ -1,56 +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.
-
-library pub_tests;
-
-import 'package:scheduled_test/scheduled_stream.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-import 'utils.dart';
-
-main() {
-  initConfig();
-  integration("warns if an asset from the entrypoint package's 'asset' "
-      "directory is requested", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("asset", [
-        d.file("file.txt", "body")
-      ])
-    ]).create();
-
-    var pub = pubServe();
-    requestShouldSucceed("assets/myapp/file.txt", "body");
-
-    pub.stderr.expect(consumeThrough(emitsLines('''
-Warning: Support for the "asset" directory is deprecated and will be removed soon.
-Please move "asset/file.txt" to "lib/file.txt".''')));
-    endPubServe();
-  });
-
-  integration("warns if an asset from a dependency's 'asset' directory is "
-      "requested", () {
-    d.dir("foo", [
-      d.libPubspec("foo", "0.0.1"),
-      d.dir("asset", [
-        d.file("file.txt", "body")
-      ])
-    ]).create();
-
-    d.dir(appPath, [
-      d.appPubspec({
-        "foo": {"path": "../foo"}
-      })
-    ]).create();
-
-    var pub = pubServe(shouldGetFirst: true);
-    requestShouldSucceed("assets/foo/file.txt", "body");
-
-    pub.stderr.expect(consumeThrough(emitsLines('''
-Warning: Support for the "asset" directory is deprecated and will be removed soon.
-Please ask the maintainer of "foo" to move "asset/file.txt" to "lib/file.txt".''')));
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_test.dart
index 74726bf..9bc2392 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_test.dart
@@ -15,12 +15,6 @@
   setUp(() {
     d.dir("foo", [
       d.libPubspec("foo", "0.0.1"),
-      d.dir("asset", [
-        d.file("foo.txt", "foo"),
-        d.dir("sub", [
-          d.file("bar.txt", "bar"),
-        ])
-      ]),
       d.dir("lib", [
         d.file("foo.dart", "foo")
       ])
@@ -100,23 +94,4 @@
     }, {"package": "foo", "path": "lib/foo.dart"});
     endPubServe();
   });
-
-  integration("converts URLs to matching asset ids in the entrypoint's asset/",
-      () {
-    // Paths in asset/.
-    pubServe(shouldGetFirst: true);
-    expectWebSocketResult("urlToAssetId", {
-      "url": getServerUrl("web", "assets/foo/foo.txt")
-    }, {"package": "foo", "path": "asset/foo.txt"});
-    endPubServe();
-  });
-
-  integration("converts URLs to matching asset ids in a dependency's of asset/",
-      () {
-    pubServe(shouldGetFirst: true);
-    expectWebSocketResult("urlToAssetId", {
-      "url": getServerUrl("web", "assets/foo/sub/bar.txt")
-    }, {"package": "foo", "path": "asset/sub/bar.txt"});
-    endPubServe();
-  });
 }
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index 0eb2417..bdeebe0 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -35,6 +35,7 @@
 import '../lib/src/lock_file.dart';
 import '../lib/src/log.dart' as log;
 import '../lib/src/package.dart';
+import '../lib/src/pubspec.dart';
 import '../lib/src/source/hosted.dart';
 import '../lib/src/source/path.dart';
 import '../lib/src/source_registry.dart';
@@ -72,6 +73,59 @@
 Matcher isUnminifiedDart2JSOutput =
     contains("// The code supports the following hooks");
 
+/// The directory containing the version of barback that should be used for this
+/// test.
+String _barbackDir;
+
+/// A map from barback versions to the paths of directories in the repo
+/// containing them.
+///
+/// This includes the latest version of barback from pkg as well as all old
+/// versions of barback in third_party.
+final _barbackVersions = _findBarbackVersions();
+
+/// Populates [_barbackVersions].
+Map<Version, String> _findBarbackVersions() {
+  var versions = {};
+  var currentBarback = path.join(repoRoot, 'pkg', 'barback');
+  versions[new Pubspec.load(currentBarback, new SourceRegistry()).version] =
+      currentBarback;
+
+  for (var dir in listDir(path.join(repoRoot, 'third_party', 'pkg'))) {
+    var basename = path.basename(dir);
+    if (!basename.startsWith('barback')) continue;
+    versions[new Version.parse(split1(basename, '-').last)] = dir;
+  }
+
+  return versions;
+}
+
+/// Runs the tests in [callback] against all versions of barback in the repo
+/// that match [versionConstraint].
+///
+/// This is used to test that pub doesn't accidentally break older versions of
+/// barback that it's committed to supporting. Only versions `0.13.0` and later
+/// will be tested.
+void withBarbackVersions(String versionConstraint, void callback()) {
+  var constraint = new VersionConstraint.parse(versionConstraint);
+
+  var validVersions = _barbackVersions.keys.where(constraint.allows);
+  if (validVersions.isEmpty) {
+    throw new ArgumentError(
+        'No available barback version matches "$versionConstraint".');
+  }
+
+  for (var version in validVersions) {
+    group("with barback $version", () {
+      setUp(() {
+        _barbackDir = _barbackVersions[version];
+      });
+
+      callback();
+    });
+  }
+}
+
 /// The completer for [port].
 Completer<int> get _portCompleter {
   if (_portCompleterCache != null) return _portCompleterCache;
@@ -627,7 +681,19 @@
 
     _addPackage(String package) {
       if (dependencies.containsKey(package)) return;
-      var packagePath = path.join(pkgDir, package);
+
+      var packagePath;
+      if (package == 'barback') {
+        if (_barbackDir == null) {
+          throw new StateError("createLockFile() can only create a lock file "
+              "with a barback dependency within a withBarbackVersions() "
+              "block.");
+        }
+        packagePath = _barbackDir;
+      } else {
+        packagePath = path.join(pkgDir, package);
+      }
+
       dependencies[package] = packagePath;
       var pubspec = loadYaml(
           readTextFile(path.join(packagePath, 'pubspec.yaml')));
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
index 1d8954c..e862b756 100644
--- 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
@@ -39,31 +39,33 @@
 
 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();
+  withBarbackVersions("any", () {
+    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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var server = pubServe();
-    requestShouldSucceed("foo.txt", JSON.encode({
-      "package": "myapp",
-      "path": "nonexistent"
-    }));
-    endPubServe();
+      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);
+      // 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 d80994b..4b95584 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
@@ -40,38 +40,40 @@
 
 main() {
   initConfig();
-  integration("can log messages", () {
-    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();
+  withBarbackVersions("any", () {
+    integration("can log messages", () {
+      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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    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..."));
+      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("""
+      pub.stdout.expect(emitsLines("""
 [Rewrite on myapp|web/foo.txt]:
 info!"""));
 
-    pub.stderr.expect(emitsLines("""
+      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."""));
 
-    pub.shouldExit(exit_codes.DATA);
+      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
index 9b41b2b..d397b1b 100644
--- 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
@@ -31,25 +31,27 @@
 
 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();
+  withBarbackVersions("any", () {
+    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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "foo.out");
-    requestShould404("foo.txt");
-    endPubServe();
+      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
index 543bf01..1e8a858 100644
--- 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
@@ -34,24 +34,26 @@
 
 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();
+  withBarbackVersions("any", () {
+    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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "primary: true, secondary: false");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.out", "primary: true, secondary: false");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/can_use_read_input_as_string_test.dart b/sdk/lib/_internal/pub/test/transformer/can_use_read_input_as_string_test.dart
index 1484c76..612eee5 100644
--- a/sdk/lib/_internal/pub/test/transformer/can_use_read_input_as_string_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/can_use_read_input_as_string_test.dart
@@ -30,24 +30,26 @@
 
 main() {
   initConfig();
-  integration("a transform can use readInputAsString", () {
-    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();
+  withBarbackVersions("any", () {
+    integration("a transform can use readInputAsString", () {
+      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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "foo.out");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/can_use_read_input_test.dart b/sdk/lib/_internal/pub/test/transformer/can_use_read_input_test.dart
index fba1eed..2adbb45 100644
--- a/sdk/lib/_internal/pub/test/transformer/can_use_read_input_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/can_use_read_input_test.dart
@@ -31,24 +31,26 @@
 
 main() {
   initConfig();
-  integration("a transform can use readInputAsString", () {
-    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();
+  withBarbackVersions("any", () {
+    integration("a transform can use readInputAsString", () {
+      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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "[[102, 111, 111]].out");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.out", "[[102, 111, 111]].out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/configuration/configuration_defaults_to_empty_map_test.dart b/sdk/lib/_internal/pub/test/transformer/configuration/configuration_defaults_to_empty_map_test.dart
index 1d8a1cf..3f7f48e 100644
--- a/sdk/lib/_internal/pub/test/transformer/configuration/configuration_defaults_to_empty_map_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/configuration/configuration_defaults_to_empty_map_test.dart
@@ -35,24 +35,26 @@
 
 main() {
   initConfig();
-  integration("configuration defaults to an empty map", () {
-    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();
+  withBarbackVersions("any", () {
+    integration("configuration defaults to an empty map", () {
+      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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var server = pubServe();
-    requestShouldSucceed("foo.json", JSON.encode({}));
-    endPubServe();
+      var server = pubServe();
+      requestShouldSucceed("foo.json", JSON.encode({}));
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/configuration/passes_configuration_to_a_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/configuration/passes_configuration_to_a_transformer_test.dart
index 48cf45a..180baa2 100644
--- a/sdk/lib/_internal/pub/test/transformer/configuration/passes_configuration_to_a_transformer_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/configuration/passes_configuration_to_a_transformer_test.dart
@@ -35,26 +35,28 @@
 
 main() {
   initConfig();
-  integration("passes configuration to a transformer", () {
-    var configuration = {"param": ["list", "of", "values"]};
+  withBarbackVersions("any", () {
+    integration("passes configuration to a transformer", () {
+      var configuration = {"param": ["list", "of", "values"]};
 
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [{"myapp/src/transformer": configuration}]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", transformer)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [{"myapp/src/transformer": configuration}]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", transformer)
+        ])]),
+        d.dir("web", [
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var server = pubServe();
-    requestShouldSucceed("foo.json", JSON.encode(configuration));
-    endPubServe();
+      var server = pubServe();
+      requestShouldSucceed("foo.json", JSON.encode(configuration));
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/configuration/with_configuration_only_instantiates_configurable_transformers_test.dart b/sdk/lib/_internal/pub/test/transformer/configuration/with_configuration_only_instantiates_configurable_transformers_test.dart
index 76259ef..3bce3bb 100644
--- a/sdk/lib/_internal/pub/test/transformer/configuration/with_configuration_only_instantiates_configurable_transformers_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/configuration/with_configuration_only_instantiates_configurable_transformers_test.dart
@@ -48,28 +48,30 @@
 
 main() {
   initConfig();
-  integration("with configuration, only instantiates configurable transformers",
-      () {
-    var configuration = {"param": ["list", "of", "values"]};
+  withBarbackVersions("any", () {
+     integration("with configuration, only instantiates configurable "
+         "transformers", () {
+       var configuration = {"param": ["list", "of", "values"]};
 
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [{"myapp/src/transformer": configuration}]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", transformer)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+       d.dir(appPath, [
+         d.pubspec({
+           "name": "myapp",
+           "transformers": [{"myapp/src/transformer": configuration}]
+         }),
+         d.dir("lib", [d.dir("src", [
+           d.file("transformer.dart", transformer)
+         ])]),
+         d.dir("web", [
+           d.file("foo.txt", "foo")
+         ])
+       ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+       createLockFile('myapp', pkg: ['barback']);
 
-    var server = pubServe();
-    requestShouldSucceed("foo.json", JSON.encode(configuration));
-    requestShould404("foo.out");
-    endPubServe();
+       var server = pubServe();
+       requestShouldSucceed("foo.json", JSON.encode(configuration));
+       requestShould404("foo.out");
+       endPubServe();
+     });
   });
 }
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart b/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart
index 9916f81..df8c0ba 100644
--- a/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart
@@ -10,37 +10,39 @@
 
 main() {
   initConfig();
-  integration("detects a transformer cycle", () {
-    d.dir("foo", [
-      d.pubspec({
-        "name": "foo",
-        "version": "1.0.0",
-        "transformers": ["myapp/transformer"],
-        "dependencies": {'myapp': {'path': '../myapp'}}
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('foo')),
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("detects a transformer cycle", () {
+      d.dir("foo", [
+        d.pubspec({
+          "name": "foo",
+          "version": "1.0.0",
+          "transformers": ["myapp/transformer"],
+          "dependencies": {'myapp': {'path': '../myapp'}}
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('foo')),
+        ])
+      ]).create();
 
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["foo/transformer"],
-        "dependencies": {'foo': {'path': '../foo'}}
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('myapp')),
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["foo/transformer"],
+          "dependencies": {'foo': {'path': '../foo'}}
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('myapp')),
+        ])
+      ]).create();
 
-    createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
+      createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
 
-    var process = startPubServe();
-    process.shouldExit(1);
-    process.stderr.expect(emitsLines(
-        "Transformer cycle detected:\n"
-        "  foo is transformed by myapp/transformer\n"
-        "  myapp is transformed by foo/transformer"));
+      var process = startPubServe();
+      process.shouldExit(1);
+      process.stderr.expect(emitsLines(
+          "Transformer cycle detected:\n"
+          "  foo is transformed by myapp/transformer\n"
+          "  myapp is transformed by foo/transformer"));
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart b/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart
index 15d8382..fe973e8 100644
--- a/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart
@@ -10,55 +10,57 @@
 
 main() {
   initConfig();
-  integration("detects an ordering dependency cycle", () {
-    d.dir("foo", [
-      d.pubspec({
-        "name": "foo",
-        "version": "1.0.0",
-        "transformers": ["myapp/transformer"],
-        "dependencies": {'myapp': {'path': '../myapp'}}
-      })
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("detects an ordering dependency cycle", () {
+      d.dir("foo", [
+        d.pubspec({
+          "name": "foo",
+          "version": "1.0.0",
+          "transformers": ["myapp/transformer"],
+          "dependencies": {'myapp': {'path': '../myapp'}}
+        })
+      ]).create();
 
-    d.dir("bar", [
-      d.pubspec({
-        "name": "bar",
-        "version": "1.0.0",
-        "dependencies": {'foo': {'path': '../foo'}}
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('bar')),
-      ])
-    ]).create();
+      d.dir("bar", [
+        d.pubspec({
+          "name": "bar",
+          "version": "1.0.0",
+          "dependencies": {'foo': {'path': '../foo'}}
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('bar')),
+        ])
+      ]).create();
 
-    d.dir("baz", [
-      d.pubspec({
-        "name": "baz",
-        "version": "1.0.0",
-        "transformers": ["bar/transformer"],
-        "dependencies": {'bar': {'path': '../bar'}}
-      })
-    ]).create();
+      d.dir("baz", [
+        d.pubspec({
+          "name": "baz",
+          "version": "1.0.0",
+          "transformers": ["bar/transformer"],
+          "dependencies": {'bar': {'path': '../bar'}}
+        })
+      ]).create();
 
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "dependencies": {'baz': {'path': '../baz'}}
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('myapp')),
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "dependencies": {'baz': {'path': '../baz'}}
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('myapp')),
+        ])
+      ]).create();
 
-    createLockFile('myapp', sandbox: ['foo', 'bar', 'baz'], pkg: ['barback']);
+      createLockFile('myapp', sandbox: ['foo', 'bar', 'baz'], pkg: ['barback']);
 
-    var process = startPubServe();
-    process.shouldExit(1);
-    process.stderr.expect(emitsLines(
-        "Transformer cycle detected:\n"
-        "  bar depends on foo\n"
-        "  foo is transformed by myapp/transformer\n"
-        "  myapp depends on baz\n"
-        "  baz is transformed by bar/transformer"));
+      var process = startPubServe();
+      process.shouldExit(1);
+      process.stderr.expect(emitsLines(
+          "Transformer cycle detected:\n"
+          "  bar depends on foo\n"
+          "  foo is transformed by myapp/transformer\n"
+          "  myapp depends on baz\n"
+          "  baz is transformed by bar/transformer"));
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/does_not_run_a_transform_on_an_input_in_another_package_test.dart b/sdk/lib/_internal/pub/test/transformer/does_not_run_a_transform_on_an_input_in_another_package_test.dart
index 01ba651..6fbb7ae 100644
--- a/sdk/lib/_internal/pub/test/transformer/does_not_run_a_transform_on_an_input_in_another_package_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/does_not_run_a_transform_on_an_input_in_another_package_test.dart
@@ -10,32 +10,34 @@
 
 main() {
   initConfig();
-  integration("does not run a transform on an input in another package", () {
-    d.dir("foo", [
-      d.pubspec({
-        "name": "foo",
-        "version": "0.0.1",
-        "transformers": ["foo/transformer"]
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ]),
-      d.dir("asset", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("does not run a transform on an input in another package", () {
+      d.dir("foo", [
+        d.pubspec({
+          "name": "foo",
+          "version": "0.0.1",
+          "transformers": ["foo/transformer"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ]),
+        d.dir("asset", [
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
 
-    d.dir(appPath, [
-      d.appPubspec({"foo": {"path": "../foo"}}),
-      d.dir("asset", [
-        d.file("bar.txt", "bar")
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.appPubspec({"foo": {"path": "../foo"}}),
+        d.dir("asset", [
+          d.file("bar.txt", "bar")
+        ])
+      ]).create();
 
-    createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
+      createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
 
-    pubServe();
-    requestShould404("assets/myapp/bar.out");
-    endPubServe();
+      pubServe();
+      requestShould404("assets/myapp/bar.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_list_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_list_test.dart
index 81fc9ca..5293039 100644
--- a/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_list_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_list_test.dart
@@ -10,39 +10,41 @@
 
 main() {
   initConfig();
-  integration("excludes a list of assets", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [
-          {
-            "myapp/src/transformer": {
-              "\$exclude": [
-                "web/foo.txt",
-                "web/sub/foo.txt"
-              ]
+  withBarbackVersions("any", () {
+    integration("excludes a list of assets", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp/src/transformer": {
+                "\$exclude": [
+                  "web/foo.txt",
+                  "web/sub/foo.txt"
+                ]
+              }
             }
-          }
-        ]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo"),
-        d.file("bar.txt", "bar"),
-        d.dir("sub", [
+          ]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
           d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar"),
+          d.dir("sub", [
+            d.file("foo.txt", "foo"),
+          ])
         ])
-      ])
-    ]).create();
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShould404("foo.out");
-    requestShould404("sub/foo.out");
-    requestShouldSucceed("bar.out", "bar.out");
-    endPubServe();
+      pubServe();
+      requestShould404("foo.out");
+      requestShould404("sub/foo.out");
+      requestShouldSucceed("bar.out", "bar.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_string_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_string_test.dart
index b5bf714..81e4163 100644
--- a/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_string_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_string_test.dart
@@ -10,36 +10,38 @@
 
 main() {
   initConfig();
-  integration("allows a single string as the asset to exclude", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [
-          {
-            "myapp/src/transformer": {
-              "\$exclude": "web/foo.txt"
+  withBarbackVersions("any", () {
+    integration("allows a single string as the asset to exclude", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp/src/transformer": {
+                "\$exclude": "web/foo.txt"
+              }
             }
-          }
-        ]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo"),
-        d.file("bar.txt", "bar"),
-        d.dir("sub", [
+          ]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
           d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar"),
+          d.dir("sub", [
+            d.file("foo.txt", "foo"),
+          ])
         ])
-      ])
-    ]).create();
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShould404("foo.out");
-    requestShouldSucceed("sub/foo.out", "foo.out");
-    requestShouldSucceed("bar.out", "bar.out");
-    endPubServe();
+      pubServe();
+      requestShould404("foo.out");
+      requestShouldSucceed("sub/foo.out", "foo.out");
+      requestShouldSucceed("bar.out", "bar.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_list_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_list_test.dart
index aac6432..4d54d3a 100644
--- a/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_list_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_list_test.dart
@@ -10,39 +10,41 @@
 
 main() {
   initConfig();
-  integration("includes assets", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [
-          {
-            "myapp/src/transformer": {
-              "\$include": [
-                "web/foo.txt",
-                "web/sub/foo.txt"
-              ]
+  withBarbackVersions("any", () {
+    integration("includes assets", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp/src/transformer": {
+                "\$include": [
+                  "web/foo.txt",
+                  "web/sub/foo.txt"
+                ]
+              }
             }
-          }
-        ]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo"),
-        d.file("bar.txt", "bar"),
-        d.dir("sub", [
+          ]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
           d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar"),
+          d.dir("sub", [
+            d.file("foo.txt", "foo"),
+          ])
         ])
-      ])
-    ]).create();
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "foo.out");
-    requestShouldSucceed("sub/foo.out", "foo.out");
-    requestShould404("bar.out");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      requestShouldSucceed("sub/foo.out", "foo.out");
+      requestShould404("bar.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_string_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_string_test.dart
index 0289126..0d90b36 100644
--- a/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_string_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_string_test.dart
@@ -10,36 +10,38 @@
 
 main() {
   initConfig();
-  integration("allows a single string as the asset to include", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [
-          {
-            "myapp/src/transformer": {
-              "\$include": "web/foo.txt"
+  withBarbackVersions("any", () {
+    integration("allows a single string as the asset to include", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp/src/transformer": {
+                "\$include": "web/foo.txt"
+              }
             }
-          }
-        ]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo"),
-        d.file("bar.txt", "bar"),
-        d.dir("sub", [
+          ]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
           d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar"),
+          d.dir("sub", [
+            d.file("foo.txt", "foo"),
+          ])
         ])
-      ])
-    ]).create();
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "foo.out");
-    requestShould404("sub/foo.out");
-    requestShould404("bar.out");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      requestShould404("sub/foo.out");
+      requestShould404("bar.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/includes_before_excludes_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/includes_before_excludes_test.dart
index 4d7f436..b620019 100644
--- a/sdk/lib/_internal/pub/test/transformer/exclusion/includes_before_excludes_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/includes_before_excludes_test.dart
@@ -10,35 +10,37 @@
 
 main() {
   initConfig();
-  integration("applies includes before excludes if both are present", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [
-          {
-            "myapp/src/transformer": {
-              "\$include": ["web/a.txt", "web/b.txt"],
-              "\$exclude": "web/a.txt"
+  withBarbackVersions("any", () {
+    integration("applies includes before excludes if both are present", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp/src/transformer": {
+                "\$include": ["web/a.txt", "web/b.txt"],
+                "\$exclude": "web/a.txt"
+              }
             }
-          }
-        ]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])]),
-      d.dir("web", [
-        d.file("a.txt", "a.txt"),
-        d.file("b.txt", "b.txt"),
-        d.file("c.txt", "c.txt")
-      ])
-    ]).create();
+          ]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
+          d.file("a.txt", "a.txt"),
+          d.file("b.txt", "b.txt"),
+          d.file("c.txt", "c.txt")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShould404("a.out");
-    requestShouldSucceed("b.out", "b.txt.out");
-    requestShould404("c.out");
-    endPubServe();
+      pubServe();
+      requestShould404("a.out");
+      requestShouldSucceed("b.out", "b.txt.out");
+      requestShould404("c.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_dart2js_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_dart2js_test.dart
index 13e821f..a590293 100644
--- a/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_dart2js_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_dart2js_test.dart
@@ -13,40 +13,42 @@
 
 main() {
   initConfig();
-  integration("works on the dart2js transformer", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [
-          {
-            "\$dart2js": {
-              "\$include": ["web/a.dart", "web/b.dart"],
-              "\$exclude": "web/a.dart"
+  withBarbackVersions("any", () {
+    integration("works on the dart2js transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "\$dart2js": {
+                "\$include": ["web/a.dart", "web/b.dart"],
+                "\$exclude": "web/a.dart"
+              }
             }
-          }
-        ]
-      }),
-      d.dir("web", [
-        d.file("a.dart", "void main() => print('hello');"),
-        d.file("b.dart", "void main() => print('hello');"),
-        d.file("c.dart", "void main() => print('hello');")
-      ])
-    ]).create();
+          ]
+        }),
+        d.dir("web", [
+          d.file("a.dart", "void main() => print('hello');"),
+          d.file("b.dart", "void main() => print('hello');"),
+          d.file("c.dart", "void main() => print('hello');")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var server = pubServe();
-    // Dart2js should remain lazy.
-    server.stdout.expect("Build completed successfully");
+      var server = pubServe();
+      // Dart2js should remain lazy.
+      server.stdout.expect("Build completed successfully");
 
-    requestShould404("a.dart.js");
-    requestShouldSucceed("b.dart.js", isNot(isEmpty));
-    server.stdout.expect(consumeThrough(emitsLines(
-        "[Info from Dart2JS]:\n"
-        "Compiling myapp|web/b.dart...")));
-    server.stdout.expect(consumeThrough("Build completed successfully"));
+      requestShould404("a.dart.js");
+      requestShouldSucceed("b.dart.js", isNot(isEmpty));
+      server.stdout.expect(consumeThrough(emitsLines(
+          "[Info from Dart2JS]:\n"
+          "Compiling myapp|web/b.dart...")));
+      server.stdout.expect(consumeThrough("Build completed successfully"));
 
-    requestShould404("c.dart.js");
-    endPubServe();
+      requestShould404("c.dart.js");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_lazy_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_lazy_transformer_test.dart
index deef7a0..8fa5b4f 100644
--- a/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_lazy_transformer_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_lazy_transformer_test.dart
@@ -13,41 +13,43 @@
 
 main() {
   initConfig();
-  integration("works on a lazy transformer", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [
-          {
-            "myapp": {
-              "\$include": ["web/a.txt", "web/b.txt"],
-              "\$exclude": "web/a.txt"
+  withBarbackVersions("any", () {
+    integration("works on a lazy transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp": {
+                "\$include": ["web/a.txt", "web/b.txt"],
+                "\$exclude": "web/a.txt"
+              }
             }
-          }
-        ]
-      }),
-      d.dir("lib", [d.file("transformer.dart", LAZY_TRANSFORMER)]),
-      d.dir("web", [
-        d.file("a.txt", "a"),
-        d.file("b.txt", "b"),
-        d.file("c.txt", "c")
-      ])
-    ]).create();
+          ]
+        }),
+        d.dir("lib", [d.file("transformer.dart", LAZY_TRANSFORMER)]),
+        d.dir("web", [
+          d.file("a.txt", "a"),
+          d.file("b.txt", "b"),
+          d.file("c.txt", "c")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var server = pubServe();
-    // The transformer should remain lazy.
-    server.stdout.expect("Build completed successfully");
+      var server = pubServe();
+      // The transformer should remain lazy.
+      server.stdout.expect("Build completed successfully");
 
-    requestShould404("a.out");
-    requestShouldSucceed("b.out", isNot(isEmpty));
-    server.stdout.expect(consumeThrough(emitsLines(
-        "[Info from LazyRewrite]:\n"
-        "Rewriting myapp|web/b.txt.")));
-    server.stdout.expect(consumeThrough("Build completed successfully"));
+      requestShould404("a.out");
+      requestShouldSucceed("b.out", isNot(isEmpty));
+      server.stdout.expect(consumeThrough(emitsLines(
+          "[Info from LazyRewrite]:\n"
+          "Rewriting myapp|web/b.txt.")));
+      server.stdout.expect(consumeThrough("Build completed successfully"));
 
-    requestShould404("c.out");
-    endPubServe();
+      requestShould404("c.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_transformer_group_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_transformer_group_test.dart
index d18fd56..27fd71c 100644
--- a/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_transformer_group_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_transformer_group_test.dart
@@ -22,36 +22,38 @@
 
 main() {
   initConfig();
-  integration("works on a transformer group", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [
-          {
-            "myapp/src/group": {
-              "\$include": ["web/a.txt", "web/b.txt"],
-              "\$exclude": "web/a.txt"
+  withBarbackVersions("any", () {
+    integration("works on a transformer group", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp/src/group": {
+                "\$include": ["web/a.txt", "web/b.txt"],
+                "\$exclude": "web/a.txt"
+              }
             }
-          }
-        ]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER),
-        d.file("group.dart", GROUP)
-      ])]),
-      d.dir("web", [
-        d.file("a.txt", "a.txt"),
-        d.file("b.txt", "b.txt"),
-        d.file("c.txt", "c.txt")
-      ])
-    ]).create();
+          ]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER),
+          d.file("group.dart", GROUP)
+        ])]),
+        d.dir("web", [
+          d.file("a.txt", "a.txt"),
+          d.file("b.txt", "b.txt"),
+          d.file("c.txt", "c.txt")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShould404("a.out");
-    requestShouldSucceed("b.out", "b.txt.out");
-    requestShould404("c.out");
-    endPubServe();
+      pubServe();
+      requestShould404("a.out");
+      requestShouldSucceed("b.out", "b.txt.out");
+      requestShould404("c.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_file_that_defines_no_transforms_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_file_that_defines_no_transforms_test.dart
index c412b5c..ebfa434 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_file_that_defines_no_transforms_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_file_that_defines_no_transforms_test.dart
@@ -14,23 +14,25 @@
 main() {
   initConfig();
 
-  integration("fails to load a file that defines no transforms", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/transformer"]
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", "library does_nothing;")
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("fails to load a file that defines no transforms", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/transformer"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", "library does_nothing;")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var pub = startPubServe();
-    pub.stderr.expect(startsWith('No transformers were defined in '));
-    pub.stderr.expect(startsWith('required by myapp.'));
-    pub.shouldExit(1);
-    pub.stderr.expect(never(contains('This is an unexpected error')));
+      var pub = startPubServe();
+      pub.stderr.expect(startsWith('No transformers were defined in '));
+      pub.stderr.expect(startsWith('required by myapp.'));
+      pub.shouldExit(1);
+      pub.stderr.expect(never(contains('This is an unexpected error')));
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_non_existent_transform_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_non_existent_transform_test.dart
index e78b8ba..57456c6 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_non_existent_transform_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_non_existent_transform_test.dart
@@ -10,17 +10,19 @@
 
 main() {
   initConfig();
-  integration("fails to load a non-existent transform", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/transform"]
-      })
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("fails to load a non-existent transform", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/transform"]
+        })
+      ]).create();
 
-    var pub = startPubServe();
-    pub.stderr.expect(
-        'Transformer library "package:myapp/transform.dart" not found.');
-    pub.shouldExit(1);
+      var pub = startPubServe();
+      pub.stderr.expect(
+          'Transformer library "package:myapp/transform.dart" not found.');
+      pub.shouldExit(1);
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_test.dart
index 2e44077..0f6e950 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_test.dart
@@ -11,24 +11,26 @@
 main() {
   initConfig();
 
-  integration("fails to load a pubspec with reserved transformer", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["\$nonexistent"]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("fails to load a pubspec with reserved transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["\$nonexistent"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var pub = startPubServe();
-    pub.stderr.expect(emitsLines(
-        'Error in pubspec for package "myapp" loaded from pubspec.yaml:\n'
-        'Invalid transformer configuration for "transformers.\$nonexistent": '
-            'Unsupported built-in transformer \$nonexistent.'));
-    pub.shouldExit(1);
+      var pub = startPubServe();
+      pub.stderr.expect(emitsLines(
+          'Error in pubspec for package "myapp" loaded from pubspec.yaml:\n'
+          'Invalid transformer configuration for "transformers.\$nonexistent": '
+              'Unsupported built-in transformer \$nonexistent.'));
+      pub.shouldExit(1);
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart
index 276d325..64be015 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart
@@ -12,19 +12,21 @@
 
 main() {
   initConfig();
-  integration("fails to load a transform from a non-dependency", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["foo"]
-      })
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("fails to load a transform from a non-dependency", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["foo"]
+        })
+      ]).create();
 
-    var pub = startPubServe();
-    // Ignore the line containing the path to the pubspec.
-    pub.stderr.expect(anything);
-    pub.stderr.expect('"transformers.foo" refers to a package that\'s not a '
-        'dependency.');
-    pub.shouldExit(1);
+      var pub = startPubServe();
+      // Ignore the line containing the path to the pubspec.
+      pub.stderr.expect(anything);
+      pub.stderr.expect('"transformers.foo" refers to a package that\'s not a '
+          'dependency.');
+      pub.shouldExit(1);
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart
index 6d3e8a8..0a61e59 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_a_syntax_error_test.dart
@@ -16,23 +16,25 @@
 
   // A syntax error will cause the analyzer to fail to parse the transformer
   // when attempting to rewrite its imports.
-  integration("fails to load a transform with a syntax error", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/src/transformer"]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", "syntax error")
-      ])])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("fails to load a transform with a syntax error", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", "syntax error")
+        ])])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var pub = startPubServe();
-    pub.stderr.expect('[RewriteImport]:');
-    pub.stderr.expect(startsWith('Error in'));
-    pub.shouldExit(1);
-    pub.stderr.expect(never(contains('This is an unexpected error')));
+      var pub = startPubServe();
+      pub.stderr.expect('[RewriteImport]:');
+      pub.stderr.expect(startsWith('Error in'));
+      pub.shouldExit(1);
+      pub.stderr.expect(never(contains('This is an unexpected error')));
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart
index 6f91042..643be22 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart
@@ -15,21 +15,23 @@
 
   // An import error will cause the isolate API to fail synchronously while
   // loading the transformer.
-  integration("fails to load a transform with an import error", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/src/transformer"]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", "import 'does/not/exist.dart';")
-      ])])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("fails to load a transform with an import error", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", "import 'does/not/exist.dart';")
+        ])])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
-    var pub = startPubServe();
-    pub.stderr.expect("'Unhandled exception:");
-    pub.stderr.expect(startsWith("Failure getting "));
-    pub.shouldExit(1);
+      createLockFile('myapp', pkg: ['barback']);
+      var pub = startPubServe();
+      pub.stderr.expect("'Unhandled exception:");
+      pub.stderr.expect(startsWith("Failure getting "));
+      pub.shouldExit(1);
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_an_unconfigurable_transformer_when_config_is_passed_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_an_unconfigurable_transformer_when_config_is_passed_test.dart
index 8033f5c..9e18ce5 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_an_unconfigurable_transformer_when_config_is_passed_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_an_unconfigurable_transformer_when_config_is_passed_test.dart
@@ -13,23 +13,25 @@
 main() {
   initConfig();
 
-  integration("fails to load an unconfigurable transformer when config is "
-      "passed", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [{"myapp/src/transformer": {'foo': 'bar'}}]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])])
-    ]).create();
+  withBarbackVersions("any", () {
+     integration("fails to load an unconfigurable transformer when config is "
+         "passed", () {
+       d.dir(appPath, [
+         d.pubspec({
+           "name": "myapp",
+           "transformers": [{"myapp/src/transformer": {'foo': 'bar'}}]
+         }),
+         d.dir("lib", [d.dir("src", [
+           d.file("transformer.dart", REWRITE_TRANSFORMER)
+         ])])
+       ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+       createLockFile('myapp', pkg: ['barback']);
 
-    var pub = startPubServe();
-    pub.stderr.expect(startsWith('No transformers that accept configuration '
-        'were defined in '));
-    pub.shouldExit(1);
+       var pub = startPubServe();
+       pub.stderr.expect(startsWith('No transformers that accept configuration '
+           'were defined in '));
+       pub.shouldExit(1);
+     });
   });
 }
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_a_diamond_transformer_dependency_graph_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_a_diamond_transformer_dependency_graph_test.dart
index ea9be41..e7a35f2 100644
--- a/sdk/lib/_internal/pub/test/transformer/loads_a_diamond_transformer_dependency_graph_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/loads_a_diamond_transformer_dependency_graph_test.dart
@@ -10,70 +10,72 @@
 
 main() {
   initConfig();
-  integration("loads a diamond transformer dependency graph", () {
-    d.dir("top", [
-      d.pubspec({
-        "name": "top",
-        "version": "1.0.0"
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('top')),
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("loads a diamond transformer dependency graph", () {
+      d.dir("top", [
+        d.pubspec({
+          "name": "top",
+          "version": "1.0.0"
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('top')),
+        ])
+      ]).create();
 
-    d.dir("left", [
-      d.pubspec({
-        "name": "left",
-        "version": "1.0.0",
-        "transformers": ["top/transformer"],
-        "dependencies": {"top": {"path": "../top"}}
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('left')),
-      ])
-    ]).create();
+      d.dir("left", [
+        d.pubspec({
+          "name": "left",
+          "version": "1.0.0",
+          "transformers": ["top/transformer"],
+          "dependencies": {"top": {"path": "../top"}}
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('left')),
+        ])
+      ]).create();
 
-    d.dir("right", [
-      d.pubspec({
-        "name": "right",
-        "version": "1.0.0",
-        "transformers": ["top/transformer"],
-        "dependencies": {"top": {"path": "../top"}}
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('right')),
-      ])
-    ]).create();
+      d.dir("right", [
+        d.pubspec({
+          "name": "right",
+          "version": "1.0.0",
+          "transformers": ["top/transformer"],
+          "dependencies": {"top": {"path": "../top"}}
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('right')),
+        ])
+      ]).create();
 
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": [
-          "left/transformer",
-          "right/transformer",
-          "myapp/transformer"
-        ],
-        "dependencies": {
-          'left': {'path': '../left'},
-          'right': {'path': '../right'},
-        }
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('myapp'))
-      ]),
-      d.dir("web", [
-        d.file("main.dart", 'const TOKEN = "main.dart";')
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            "left/transformer",
+            "right/transformer",
+            "myapp/transformer"
+          ],
+          "dependencies": {
+            'left': {'path': '../left'},
+            'right': {'path': '../right'},
+          }
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('myapp'))
+        ]),
+        d.dir("web", [
+          d.file("main.dart", 'const TOKEN = "main.dart";')
+        ])
+      ]).create();
 
-    createLockFile('myapp',
-        sandbox: ['top', 'left', 'right'],
-        pkg: ['barback']);
+      createLockFile('myapp',
+          sandbox: ['top', 'left', 'right'],
+          pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("main.dart",
-        'const TOKEN = "(((main.dart, (left, top)), (right, top)), ((myapp, '
-        '(left, top)), (right, top)))";');
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("main.dart",
+          'const TOKEN = "(((main.dart, (left, top)), (right, top)), ((myapp, '
+          '(left, top)), (right, top)))";');
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_a_transformer_defined_in_an_exported_library_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_a_transformer_defined_in_an_exported_library_test.dart
index d38baa6..aab1900 100644
--- a/sdk/lib/_internal/pub/test/transformer/loads_a_transformer_defined_in_an_exported_library_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/loads_a_transformer_defined_in_an_exported_library_test.dart
@@ -10,27 +10,29 @@
 
 main() {
   initConfig();
-  integration("loads a transformer defined in an exported library", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp"]
-      }),
-      d.dir("lib", [
-        d.file("myapp.dart", "export 'src/transformer.dart';"),
-        d.dir("src", [
-          d.file("transformer.dart", REWRITE_TRANSFORMER)
+  withBarbackVersions("any", () {
+    integration("loads a transformer defined in an exported library", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp"]
+        }),
+        d.dir("lib", [
+          d.file("myapp.dart", "export 'src/transformer.dart';"),
+          d.dir("src", [
+            d.file("transformer.dart", REWRITE_TRANSFORMER)
+          ])
+        ]),
+        d.dir("web", [
+          d.file("foo.txt", "foo")
         ])
-      ]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "foo.out");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart
index 70412d4..7689b6a 100644
--- a/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart
@@ -10,45 +10,47 @@
 
 main() {
   initConfig();
-  integration("loads ordering dependencies in the correct order", () {
-    d.dir("foo", [
-      d.libPubspec("foo", '1.0.0'),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('foo'))
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("loads ordering dependencies in the correct order", () {
+      d.dir("foo", [
+        d.libPubspec("foo", '1.0.0'),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('foo'))
+        ])
+      ]).create();
 
-    d.dir("bar", [
-      d.pubspec({
-        "name": "bar",
-        "version": "1.0.0",
-        "transformers": ["foo/transformer"],
-        "dependencies": {"foo": {"path": "../foo"}}
-      }),
-      d.dir("lib", [
-        d.file("bar.dart", 'const TOKEN = "bar";')
-      ])
-    ]).create();
+      d.dir("bar", [
+        d.pubspec({
+          "name": "bar",
+          "version": "1.0.0",
+          "transformers": ["foo/transformer"],
+          "dependencies": {"foo": {"path": "../foo"}}
+        }),
+        d.dir("lib", [
+          d.file("bar.dart", 'const TOKEN = "bar";')
+        ])
+      ]).create();
 
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/transformer"],
-        "dependencies": {"bar": {"path": "../bar"}}
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('myapp', import: 'bar'))
-      ]),
-      d.dir("web", [
-        d.file("main.dart", 'const TOKEN = "main.dart";')
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/transformer"],
+          "dependencies": {"bar": {"path": "../bar"}}
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('myapp', import: 'bar'))
+        ]),
+        d.dir("web", [
+          d.file("main.dart", 'const TOKEN = "main.dart";')
+        ])
+      ]).create();
 
-    createLockFile('myapp', sandbox: ['foo', 'bar'], pkg: ['barback']);
+      createLockFile('myapp', sandbox: ['foo', 'bar'], pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("main.dart",
-        'const TOKEN = "(main.dart, myapp imports (bar, foo))";');
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("main.dart",
+          'const TOKEN = "(main.dart, myapp imports (bar, foo))";');
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/prefers_transformer_to_library_name_test.dart b/sdk/lib/_internal/pub/test/transformer/prefers_transformer_to_library_name_test.dart
index f116bd4..b28506c 100644
--- a/sdk/lib/_internal/pub/test/transformer/prefers_transformer_to_library_name_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/prefers_transformer_to_library_name_test.dart
@@ -29,26 +29,28 @@
 
 main() {
   initConfig();
-  integration("prefers transformer.dart to <package name>.dart", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp"]
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER),
-        d.file("myapp.dart", WRONG_TRANSFORMER)
-      ]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("prefers transformer.dart to <package name>.dart", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER),
+          d.file("myapp.dart", WRONG_TRANSFORMER)
+        ]),
+        d.dir("web", [
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "foo.out");
-    requestShould404("foo.wrong");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      requestShould404("foo.wrong");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/prints_a_transform_error_in_apply_test.dart b/sdk/lib/_internal/pub/test/transformer/prints_a_transform_error_in_apply_test.dart
index 319d0c3..2ec8320 100644
--- a/sdk/lib/_internal/pub/test/transformer/prints_a_transform_error_in_apply_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/prints_a_transform_error_in_apply_test.dart
@@ -24,26 +24,28 @@
 
 main() {
   initConfig();
-  integration("prints a transform error in apply", () {
-    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();
+  withBarbackVersions("any", () {
+    integration("prints a transform error in apply", () {
+      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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var server = pubServe();
-    server.stderr.expect(emitsLines(
-        'Build error:\n'
-        'Transform Rewrite on myapp|web/foo.txt threw error: oh no!'));
-    endPubServe();
+      var server = pubServe();
+      server.stderr.expect(emitsLines(
+          'Build error:\n'
+          'Transform Rewrite on myapp|web/foo.txt threw error: oh no!'));
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/prints_a_transform_interface_error_test.dart b/sdk/lib/_internal/pub/test/transformer/prints_a_transform_interface_error_test.dart
index e0cb517..40bd9ee 100644
--- a/sdk/lib/_internal/pub/test/transformer/prints_a_transform_interface_error_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/prints_a_transform_interface_error_test.dart
@@ -22,27 +22,29 @@
 
 main() {
   initConfig();
-  integration("prints a transform interface error", () {
-    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();
+  withBarbackVersions("any", () {
+    integration("prints a transform interface error", () {
+      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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    var server = pubServe();
-    server.stderr.expect(emitsLines(
-        "Build error:\n"
-        "Transform Rewrite on myapp|web/foo.txt threw error: Class "
-            "'RewriteTransformer' has no instance method 'apply'."));
-    endPubServe();
+      var server = pubServe();
+      server.stderr.expect(emitsLines(
+          "Build error:\n"
+          "Transform Rewrite on myapp|web/foo.txt threw error: Class "
+              "'RewriteTransformer' has no instance method 'apply'."));
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_a_local_transform_on_the_application_package_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_a_local_transform_on_the_application_package_test.dart
index a9e3e8f..6412284 100644
--- a/sdk/lib/_internal/pub/test/transformer/runs_a_local_transform_on_the_application_package_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/runs_a_local_transform_on_the_application_package_test.dart
@@ -10,24 +10,26 @@
 
 main() {
   initConfig();
-  integration("runs a local transform on the application package", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/src/transformer"]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("runs a local transform on the application package", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "foo.out");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transform_on_the_application_package_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transform_on_the_application_package_test.dart
index af361f8..99b2d06 100644
--- a/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transform_on_the_application_package_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transform_on_the_application_package_test.dart
@@ -10,29 +10,31 @@
 
 main() {
   initConfig();
-  integration("runs a third-party transform on the application package", () {
-    d.dir("foo", [
-      d.libPubspec("foo", '1.0.0'),
-      d.dir("lib", [
-        d.file("foo.dart", REWRITE_TRANSFORMER)
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("runs a third-party transform on the application package", () {
+      d.dir("foo", [
+        d.libPubspec("foo", '1.0.0'),
+        d.dir("lib", [
+          d.file("foo.dart", REWRITE_TRANSFORMER)
+        ])
+      ]).create();
 
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "dependencies": {"foo": {"path": "../foo"}},
-        "transformers": ["foo"]
-      }),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "dependencies": {"foo": {"path": "../foo"}},
+          "transformers": ["foo"]
+        }),
+        d.dir("web", [
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
 
-    createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
+      createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "foo.out");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transformer_on_a_local_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transformer_on_a_local_transformer_test.dart
index eafde5d..ca9dbdf 100644
--- a/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transformer_on_a_local_transformer_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/runs_a_third_party_transformer_on_a_local_transformer_test.dart
@@ -10,33 +10,35 @@
 
 main() {
   initConfig();
-  integration("runs a third-party transformer on a local transformer", () {
-    d.dir("foo", [
-      d.libPubspec("foo", '1.0.0'),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('foo'))
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("runs a third-party transformer on a local transformer", () {
+      d.dir("foo", [
+        d.libPubspec("foo", '1.0.0'),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('foo'))
+        ])
+      ]).create();
 
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["foo/transformer", "myapp/transformer"],
-        "dependencies": {"foo": {"path": "../foo"}}
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('myapp'))
-      ]),
-      d.dir("web", [
-        d.file("main.dart", 'const TOKEN = "main.dart";')
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["foo/transformer", "myapp/transformer"],
+          "dependencies": {"foo": {"path": "../foo"}}
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('myapp'))
+        ]),
+        d.dir("web", [
+          d.file("main.dart", 'const TOKEN = "main.dart";')
+        ])
+      ]).create();
 
-    createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
+      createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("main.dart",
-        'const TOKEN = "((main.dart, foo), (myapp, foo))";');
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("main.dart",
+          'const TOKEN = "((main.dart, foo), (myapp, foo))";');
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_a_transform_on_a_dependency_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_a_transform_on_a_dependency_test.dart
deleted file mode 100644
index f106895..0000000
--- a/sdk/lib/_internal/pub/test/transformer/runs_a_transform_on_a_dependency_test.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2013, 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';
-
-main() {
-  initConfig();
-  integration("runs a local transform on a dependency", () {
-    d.dir("foo", [
-      d.pubspec({
-        "name": "foo",
-        "version": "0.0.1",
-        "transformers": ["foo/transformer"]
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER)
-      ]),
-      d.dir("asset", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
-
-    d.dir(appPath, [
-      d.appPubspec({"foo": {"path": "../foo"}}),
-    ]).create();
-
-    createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
-
-    pubServe();
-    requestShouldSucceed("assets/foo/foo.out", "foo.out");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_a_transformer_group_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_a_transformer_group_test.dart
index b0a17ec..fa696bc 100644
--- a/sdk/lib/_internal/pub/test/transformer/runs_a_transformer_group_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/runs_a_transformer_group_test.dart
@@ -22,25 +22,27 @@
 
 main() {
   initConfig();
-  integration("runs a transformer group", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/src/group"]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", REWRITE_TRANSFORMER),
-        d.file("group.dart", GROUP)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("runs a transformer group", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/group"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER),
+          d.file("group.dart", GROUP)
+        ])]),
+        d.dir("web", [
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
 
-    createLockFile('myapp', pkg: ['barback']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.out", "foo.out");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_a_transformer_on_a_dependency_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_a_transformer_on_a_dependency_test.dart
new file mode 100644
index 0000000..b2092e5
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/runs_a_transformer_on_a_dependency_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2013, 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';
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("runs a local transformer on a dependency", () {
+      d.dir("foo", [
+        d.pubspec({
+          "name": "foo",
+          "version": "0.0.1",
+          "transformers": ["foo/transformer"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER),
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
+
+      d.dir(appPath, [
+        d.appPubspec({"foo": {"path": "../foo"}}),
+      ]).create();
+
+      createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
+
+      pubServe();
+      requestShouldSucceed("packages/foo/foo.out", "foo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/runs_one_third_party_transformer_on_another_test.dart b/sdk/lib/_internal/pub/test/transformer/runs_one_third_party_transformer_on_another_test.dart
index 8ba5497..079e377 100644
--- a/sdk/lib/_internal/pub/test/transformer/runs_one_third_party_transformer_on_another_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/runs_one_third_party_transformer_on_another_test.dart
@@ -10,45 +10,47 @@
 
 main() {
   initConfig();
-  integration("runs one third-party transformer on another", () {
-    d.dir("foo", [
-      d.pubspec({
-        "name": "foo",
-        "version": "1.0.0"
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('foo')),
-      ])
-    ]).create();
+  withBarbackVersions("any", () {
+    integration("runs one third-party transformer on another", () {
+      d.dir("foo", [
+        d.pubspec({
+          "name": "foo",
+          "version": "1.0.0"
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('foo')),
+        ])
+      ]).create();
 
-    d.dir("bar", [
-      d.pubspec({
-        "name": "bar",
-        "version": "1.0.0",
-        "transformers": ["foo/transformer"],
-        "dependencies": {"foo": {"path": "../foo"}}
-      }),
-      d.dir("lib", [
-        d.file("transformer.dart", dartTransformer('bar')),
-      ])
-    ]).create();
+      d.dir("bar", [
+        d.pubspec({
+          "name": "bar",
+          "version": "1.0.0",
+          "transformers": ["foo/transformer"],
+          "dependencies": {"foo": {"path": "../foo"}}
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", dartTransformer('bar')),
+        ])
+      ]).create();
 
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["bar/transformer"],
-        "dependencies": {'bar': {'path': '../bar'}}
-      }),
-      d.dir("web", [
-        d.file("main.dart", 'const TOKEN = "main.dart";')
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["bar/transformer"],
+          "dependencies": {'bar': {'path': '../bar'}}
+        }),
+        d.dir("web", [
+          d.file("main.dart", 'const TOKEN = "main.dart";')
+        ])
+      ]).create();
 
-    createLockFile('myapp', sandbox: ['foo', 'bar'], pkg: ['barback']);
+      createLockFile('myapp', sandbox: ['foo', 'bar'], pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("main.dart",
-        'const TOKEN = "(main.dart, (bar, foo))";');
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("main.dart",
+          'const TOKEN = "(main.dart, (bar, foo))";');
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/supports_a_transformer_that_doesnt_return_futures_test.dart b/sdk/lib/_internal/pub/test/transformer/supports_a_transformer_that_doesnt_return_futures_test.dart
index e4ac4ef..0d67187 100644
--- a/sdk/lib/_internal/pub/test/transformer/supports_a_transformer_that_doesnt_return_futures_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/supports_a_transformer_that_doesnt_return_futures_test.dart
@@ -31,24 +31,26 @@
 
 main() {
   initConfig();
-  integration("supports a transformer that doesn't return futures", () {
-    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();
+  withBarbackVersions("any", () {
+    integration("supports a transformer that doesn't return futures", () {
+      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']);
+      createLockFile('myapp', pkg: ['barback']);
 
-    pubServe();
-    requestShouldSucceed("foo.txt", "new contents");
-    endPubServe();
+      pubServe();
+      requestShouldSucceed("foo.txt", "new contents");
+      endPubServe();
+    });
   });
 }
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 87e107f..f953a5a 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -11,55 +11,65 @@
 /**
  * A source of asynchronous data events.
  *
- * A Stream provides a sequence of events. Each event is either a data event or
- * an error event, representing the result of a single computation. When the
- * Stream is exhausted, it may send a single "done" event.
+ * A Stream provides a way to receive a sequence of events.
+ * Each event is either a data event or an error event,
+ * representing the result of a single computation.
+ * When the events provided by a Stream have all been sent,
+ * a single "done" event will mark the end.
  *
- * You can [listen] on a stream to receive the events it sends. When you listen,
- * you receive a [StreamSubscription] object that can be used to stop listening,
- * or to temporarily pause events from the stream.
+ * You can [listen] on a stream to make it start generating events,
+ * and to set up listeners that receive the events.
+ * When you listen, you receive a [StreamSubscription] object
+ * which is the active object providing the events,
+ * and which can be used to stop listening again,
+ * or to temporarily pause events from the subscription.
  *
- * When an event is fired, the listeners at that time are informed.
- * If a listener is added while an event is being fired, the change
- * will only take effect after the event is completely fired. If a listener
- * is canceled, it immediately stops receiving events.
- *
- * When the "done" event is fired, subscribers are unsubscribed before
- * receiving the event. After the event has been sent, the stream has no
- * subscribers. Adding new subscribers after this point is allowed, but
- * they will just receive a new "done" event as soon as possible.
- *
- * Streams always respect "pause" requests. If necessary they need to buffer
- * their input, but often, and preferably, they can simply request their input
- * to pause too.
- *
- * There are two kinds of streams: The normal "single-subscription" streams and
+ * There are two kinds of streams: "Single-subscription" streams and
  * "broadcast" streams.
  *
- * A single-subscription stream allows only a single listener during the whole
+ * *A single-subscription stream* allows only a single listener during the whole
  * lifetime of the stream.
- * It holds back events until it gets a listener, and it may exhaust
- * itself when the listener is unsubscribed, even if the stream wasn't done.
+ * It doesn't start generating events until it has a listener,
+ * and it stops sending events when the listener is unsubscribed,
+ * even if the source of events could still provide more.
  *
- * Single-subscription streams are generally used for streaming parts of
- * contiguous data like file I/O.
+ * Listening twice on a single-subscription stream is not allowed, even after
+ * the first subscription has been canceled.
  *
- * A broadcast stream allows any number of listeners, and it fires
+ * Single-subscription streams are generally used for streaming chunks of
+ * larger contiguous data like file I/O.
+ *
+ * *A broadcast stream* allows any number of listeners, and it fires
  * its events when they are ready, whether there are listeners or not.
  *
  * Broadcast streams are used for independent events/observers.
  *
- * Stream transformations, such as [where] and [skip],
- * return the same type of stream as the one the method was called on,
+ * If several listeners want to listen to a single subscription stream,
+ * use [asBroadcastStream] to create a broadcast stream on top of the
+ * non-broadcast stream.
+ *
+ * On either kind of stream, stream transformationss, such as [where] and
+ * [skip], return the same type of stream as the one the method was called on,
  * unless otherwise noted.
  *
- * If several listeners want to listen to the returned
- * stream, use [asBroadcastStream] to create a broadcast stream on top of the
- * non-broadcast stream.
+ * When an event is fired, the listener(s) at that time will receive the event.
+ * If a listener is added to a broadcast stream while an event is being fired,
+ * that listener will not receive the event currently being fired.
+ * If a listener is canceled, it immediately stops receiving events.
+ *
+ * When the "done" event is fired, subscribers are unsubscribed before
+ * receiving the event. After the event has been sent, the stream has no
+ * subscribers. Adding new subscribers to a broadcast stream after this point
+ * is allowed, but they will just receive a new "done" event as soon
+ * as possible.
+ *
+ * Stream subscriptions always respect "pause" requests. If necessary they need
+ * to buffer their input, but often, and preferably, they can simply request
+ * their input to pause too.
  *
  * The default implementation of [isBroadcast] returns false.
  * A broadcast stream inheriting from [Stream] must override [isBroadcast]
- * to return [:true:].
+ * to return `true`.
  */
 abstract class Stream<T> {
   Stream();
@@ -71,6 +81,9 @@
    * data or error, and then close with a done-event.
    */
   factory Stream.fromFuture(Future<T> future) {
+    // Use the controller's buffering to fill in the value even before
+    // the stream has a listener. For a single value, it's not worth it
+    // to wait for a listener before doing the `then` on the future.
     StreamController<T> controller = new StreamController<T>(sync: true);
     future.then((value) {
         controller.add(value);
@@ -86,6 +99,9 @@
   /**
    * Creates a single-subscription stream that gets its data from [data].
    *
+   * The iterable is iterated when the stream receives a listener, and stops
+   * iterating if the listener cancels the subscription.
+   *
    * If iterating [data] throws an error, the stream ends immediately with
    * that error. No done event will be sent (iteration is not complete), but no
    * further data events will be generated either, since iteration cannot
@@ -192,6 +208,8 @@
    *     }
    *
    *     stringStream.transform(new DuplicationTransformer());
+   *
+   * The resulting stream is a broadcast stream if [source] is.
    */
   factory Stream.eventTransformed(Stream source,
                                   EventSink mapSink(EventSink<T> sink)) {
@@ -262,6 +280,8 @@
    * but it only sends the data events that satisfy the [test].
    *
    * The returned stream is a broadcast stream if this stream is.
+   * If a broadcast stream is listened to more than once, each subscription
+   * will individually perform the `test`.
    */
   Stream<T> where(bool test(T event)) {
     return new _WhereStream<T>(this, test);
@@ -272,6 +292,8 @@
    * to a new value using the [convert] function.
    *
    * The returned stream is a broadcast stream if this stream is.
+   * If a broadcast stream is listened to more than once, each subscription
+   * will individually execute `map` for each event.
    */
   Stream map(convert(T event)) {
     return new _MapStream<T, dynamic>(this, convert);
@@ -407,9 +429,11 @@
    *
    * If you need to transform an error into a data event, use the more generic
    * [Stream.transform] to handle the event by writing a data event to
-   * the output sink
+   * the output sink.
    *
    * The returned stream is a broadcast stream if this stream is.
+   * If a broadcast stream is listened to more than once, each subscription
+   * will individually perform the `test` and handle the error.
    */
   Stream<T> handleError(Function onError, { bool test(error) }) {
     return new _HandleErrorStream<T>(this, onError, test);
@@ -424,6 +448,8 @@
    * in order.
    *
    * The returned stream is a broadcast stream if this stream is.
+   * If a broadcast stream is listened to more than once, each subscription
+   * will individually call `convert` and expand the events.
    */
   Stream expand(Iterable convert(T value)) {
     return new _ExpandStream<T, dynamic>(this, convert);
@@ -431,6 +457,11 @@
 
   /**
    * Binds this stream as the input of the provided [StreamConsumer].
+   *
+   * The `streamConsumer` is closed when the stream has been added to it.
+   *
+   * Returns a future which completes when the stream has been consumed
+   * and the consumer has been closed.
    */
   Future pipe(StreamConsumer<T> streamConsumer) {
     return streamConsumer.addStream(this).then((_) => streamConsumer.close());
@@ -716,7 +747,15 @@
     return future;
   }
 
-  /** Collects the data of this stream in a [Set]. */
+  /**
+   * Collects the data of this stream in a [Set].
+   *
+   * The returned set is the same type as returned by `new Set<T>()`.
+   * If another type of set is needed, either use [forEach] to add each
+   * element to the set, or use
+   * `toList().then((list) => new SomeOtherSet.from(list))`
+   * to create the set.
+   */
   Future<Set<T>> toSet() {
     Set<T> result = new Set<T>();
     _Future<Set<T>> future = new _Future<Set<T>>();
@@ -763,6 +802,8 @@
    * cannot be reused after a call to this method.
    *
    * The returned stream is a broadcast stream if this stream is.
+   * For a broadcast stream, the events are only counted from the time
+   * the returned stream is listened to.
    */
   Stream<T> take(int count) {
     return new _TakeStream(this, count);
@@ -783,6 +824,8 @@
    * cannot be reused after a call to this method.
    *
    * The returned stream is a broadcast stream if this stream is.
+   * For a broadcast stream, the events are only tested from the time
+   * the returned stream is listened to.
    */
   Stream<T> takeWhile(bool test(T element)) {
     return new _TakeWhileStream(this, test);
@@ -792,6 +835,8 @@
    * Skips the first [count] data events from this stream.
    *
    * The returned stream is a broadcast stream if this stream is.
+   * For a broadcast stream, the events are only counted from the time
+   * the returned stream is listened to.
    */
   Stream<T> skip(int count) {
     return new _SkipStream(this, count);
@@ -806,6 +851,8 @@
    * event data, the returned stream will have the same events as this stream.
    *
    * The returned stream is a broadcast stream if this stream is.
+   * For a broadcast stream, the events are only tested from the time
+   * the returned stream is listened to.
    */
   Stream<T> skipWhile(bool test(T element)) {
     return new _SkipWhileStream(this, test);
@@ -821,6 +868,8 @@
    * omitted, the '==' operator on the last provided data element is used.
    *
    * The returned stream is a broadcast stream if this stream is.
+   * If a broadcast stream is listened to more than once, each subscription
+   * will individually perform the `equals` test.
    */
   Stream<T> distinct([bool equals(T previous, T next)]) {
     return new _DistinctStream(this, equals);
@@ -1113,6 +1162,9 @@
    * into the error channel of the returned stream.
    *
    * The returned stream is a broadcast stream if this stream is.
+   * If a broadcast stream is listened to more than once, each subscription
+   * will have its individually timer that starts counting on listen,
+   * and the subscriptions' timers can be paused individually.
    */
   Stream timeout(Duration timeLimit, {void onTimeout(EventSink sink)}) {
     StreamController controller;
@@ -1186,12 +1238,15 @@
 }
 
 /**
- * A control object for the subscription on a [Stream].
+ * A subscritption on events from a [Stream].
  *
- * When you subscribe on a [Stream] using [Stream.listen],
- * a [StreamSubscription] object is returned. This object
- * is used to later unsubscribe again, or to temporarily pause
- * the stream's events.
+ * When you listen on a [Stream] using [Stream.listen],
+ * a [StreamSubscription] object is returned.
+ *
+ * The subscription provides events to the listener,
+ * and holds the callbacks used to handle the events.
+ * The subscription can also be used to unsubscribe from the events,
+ * or to temporarily pause the events from the stream.
  */
 abstract class StreamSubscription<T> {
   /**
@@ -1212,18 +1267,28 @@
    */
   Future cancel();
 
-  /** Set or override the data event handler of this subscription. */
+  /**
+   * Set or override the data event handler of this subscription.
+   *
+   * This method overrides the handler that has been set at the invocation of
+   * [Stream.listen].
+   */
   void onData(void handleData(T data));
 
   /**
    * Set or override the error event handler of this subscription.
    *
    * This method overrides the handler that has been set at the invocation of
-   * [Stream.listen].
+   * [Stream.listen] or by calling [asFuture].
    */
   void onError(Function handleError);
 
-  /** Set or override the done event handler of this subscription. */
+  /**
+   * Set or override the done event handler of this subscription.
+   *
+   * This method overrides the handler that has been set at the invocation of
+   * [Stream.listen] or by calling [asFuture].
+   */
   void onDone(void handleDone());
 
   /**
diff --git a/sdk/lib/collection/maps.dart b/sdk/lib/collection/maps.dart
index 1e4214f..28d7665 100644
--- a/sdk/lib/collection/maps.dart
+++ b/sdk/lib/collection/maps.dart
@@ -182,7 +182,7 @@
  */
 class MapView<K, V> implements Map<K, V> {
   final Map<K, V> _map;
-  MapView(Map<K, V> map) : _map = map;
+  const MapView(Map<K, V> map) : _map = map;
 
   V operator[](Object key) => _map[key];
   void operator[]=(K key, V value) { _map[key] = value; }
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index fa292d5..84ebc80 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -1502,23 +1502,6 @@
   @DocsEditable()
   String textBaseline;
 
-  @JSName('webkitBackingStorePixelRatio')
-  /**
-   * The ratio between this canvas' backing store dimensions and the canvas'
-   * logical dimensions.
-   *
-   * ## Other resources
-   *
-   * * [High DPI Canvas tutorial]
-   * (http://www.html5rocks.com/en/tutorials/canvas/hidpi/) from HTML5Rocks.
-   */
-  @DomName('CanvasRenderingContext2D.webkitBackingStorePixelRatio')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  final double backingStorePixelRatio;
-
   @JSName('arc')
   @DomName('CanvasRenderingContext2D.arc')
   @DocsEditable()
@@ -2058,6 +2041,11 @@
   void fill([String winding = 'nonzero']) {
     JS('void', '#.fill(#)', this, winding);
   }
+
+  /** Deprecated always returns 1.0 */
+  @DomName('CanvasRenderingContext2D.webkitBackingStorePixelRation')
+  @Experimental()
+  double get backingStorePixelRatio => 1.0;
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10272,6 +10260,55 @@
    */
   ElementEvents get on => new ElementEvents(this);
 
+  @DomName('Element.offsetHeight')
+  @DocsEditable()
+  final num offsetHeight;
+
+  @DomName('Element.offsetLeft')
+  @DocsEditable()
+  final num offsetLeft;
+
+  @DomName('Element.offsetTop')
+  @DocsEditable()
+  final num offsetTop;
+
+  @DomName('Element.offsetWidth')
+  @DocsEditable()
+  final num offsetWidth;
+
+  @DomName('Element.clientHeight')
+  @DocsEditable()
+  final num clientHeight;
+
+  @DomName('Element.clientLeft')
+  @DocsEditable()
+  final num clientLeft;
+
+  @DomName('Element.clientTop')
+  @DocsEditable()
+  final num clientTop;
+
+  @DomName('Element.clientWidth')
+  @DocsEditable()
+  final num clientWidth;
+
+  @DomName('Element.scrollHeight')
+  @DocsEditable()
+  final num scrollHeight;
+
+  @DomName('Element.scrollLeft')
+  @DocsEditable()
+  num scrollLeft;
+
+  @DomName('Element.scrollTop')
+  @DocsEditable()
+  num scrollTop;
+
+  @DomName('Element.scrollWidth')
+  @DocsEditable()
+  final num scrollWidth;
+
+
   // To suppress missing implicit constructor warnings.
   factory Element._() { throw new UnsupportedError("Not supported"); }
 
@@ -10955,21 +10992,25 @@
   @DocsEditable()
   String className;
 
+  @JSName('clientHeight')
   @DomName('Element.clientHeight')
   @DocsEditable()
-  final int clientHeight;
+  final int _clientHeight;
 
+  @JSName('clientLeft')
   @DomName('Element.clientLeft')
   @DocsEditable()
-  final int clientLeft;
+  final int _clientLeft;
 
+  @JSName('clientTop')
   @DomName('Element.clientTop')
   @DocsEditable()
-  final int clientTop;
+  final int _clientTop;
 
+  @JSName('clientWidth')
   @DomName('Element.clientWidth')
   @DocsEditable()
-  final int clientWidth;
+  final int _clientWidth;
 
   @DomName('Element.id')
   @DocsEditable()
@@ -10986,46 +11027,54 @@
   // Use implementation from Node.
   // final String _namespaceUri;
 
+  @JSName('offsetHeight')
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  final int offsetHeight;
+  final int _offsetHeight;
 
+  @JSName('offsetLeft')
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  final int offsetLeft;
+  final int _offsetLeft;
 
   @DomName('Element.offsetParent')
   @DocsEditable()
   final Element offsetParent;
 
+  @JSName('offsetTop')
   @DomName('Element.offsetTop')
   @DocsEditable()
-  final int offsetTop;
+  final int _offsetTop;
 
+  @JSName('offsetWidth')
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  final int offsetWidth;
+  final int _offsetWidth;
 
   @JSName('outerHTML')
   @DomName('Element.outerHTML')
   @DocsEditable()
   final String outerHtml;
 
+  @JSName('scrollHeight')
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  final int scrollHeight;
+  final int _scrollHeight;
 
+  @JSName('scrollLeft')
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int scrollLeft;
+  int _scrollLeft;
 
+  @JSName('scrollTop')
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int scrollTop;
+  int _scrollTop;
 
+  @JSName('scrollWidth')
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  final int scrollWidth;
+  final int _scrollWidth;
 
   @DomName('Element.style')
   @DocsEditable()
@@ -23284,9 +23333,10 @@
   @DocsEditable()
   final Element activeElement;
 
+  @JSName('applyAuthorStyles')
   @DomName('ShadowRoot.applyAuthorStyles')
   @DocsEditable()
-  bool applyAuthorStyles;
+  bool _applyAuthorStyles;
 
   @DomName('ShadowRoot.host')
   @DocsEditable()
@@ -23354,6 +23404,14 @@
   void set resetStyleInheritance(bool value) {
     this._resetStyleInheritance = value;
   }
+
+  @deprecated
+  bool get applyAuthorStyles => this._applyAuthorStyles;
+
+  @deprecated
+  void set applyAuthorStyles(bool value) {
+    this._applyAuthorStyles = value;
+  }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 06d047d..e146df0 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -484,6 +484,9 @@
   'XPathResult': XPathResult,
   'XSLTProcessor': XsltProcessor,
 
+  // FIXME: Temporary workaround.  The Blink name matches the Dart name
+  // post Chrome 35.  We still generate the old mapping from 'Clipboard'.
+  'DataTransfer': DataTransfer,
 };
 // 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
@@ -2156,22 +2159,6 @@
   @DocsEditable()
   void set textBaseline(String value) => _blink.Native_CanvasRenderingContext2D_textBaseline_Setter(this, value);
 
-  /**
-   * The ratio between this canvas' backing store dimensions and the canvas'
-   * logical dimensions.
-   *
-   * ## Other resources
-   *
-   * * [High DPI Canvas tutorial]
-   * (http://www.html5rocks.com/en/tutorials/canvas/hidpi/) from HTML5Rocks.
-   */
-  @DomName('CanvasRenderingContext2D.webkitBackingStorePixelRatio')
-  @DocsEditable()
-  @SupportedBrowser(SupportedBrowser.CHROME)
-  @SupportedBrowser(SupportedBrowser.SAFARI)
-  @Experimental()
-  double get backingStorePixelRatio => _blink.Native_CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter(this);
-
   @DomName('CanvasRenderingContext2D.arc')
   @DocsEditable()
   void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.Native_CanvasRenderingContext2D_arc_Callback(this, x, y, radius, startAngle, endAngle, anticlockwise);
@@ -2567,6 +2554,11 @@
   }
 
 
+
+  /** Deprecated always returns 1.0 */
+  @DomName('CanvasRenderingContext2D.webkitBackingStorePixelRation')
+  @Experimental()
+  double get backingStorePixelRatio => 1.0;
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10595,6 +10587,62 @@
    */
   ElementEvents get on => new ElementEvents(this);
 
+  @DomName('Element.offsetHeight')
+  @DocsEditable()
+  num get offsetHeight => _blink.Native_Element_offsetHeight_Getter(this);
+
+  @DomName('Element.offsetLeft')
+  @DocsEditable()
+  num get offsetLeft => _blink.Native_Element_offsetLeft_Getter(this);
+
+  @DomName('Element.offsetTop')
+  @DocsEditable()
+  num get offsetTop => _blink.Native_Element_offsetTop_Getter(this);
+
+  @DomName('Element.offsetWidth')
+  @DocsEditable()
+  num get offsetWidth => _blink.Native_Element_offsetWidth_Getter(this);
+
+  @DomName('Element.clientHeight')
+  @DocsEditable()
+  num get clientHeight => _blink.Native_Element_clientHeight_Getter(this);
+
+  @DomName('Element.clientLeft')
+  @DocsEditable()
+  num get clientLeft => _blink.Native_Element_clientLeft_Getter(this);
+
+  @DomName('Element.clientTop')
+  @DocsEditable()
+  num get clientTop => _blink.Native_Element_clientTop_Getter(this);
+
+  @DomName('Element.clientWidth')
+  @DocsEditable()
+  num get clientWidth => _blink.Native_Element_clientWidth_Getter(this);
+
+  @DomName('Element.scrollHeight')
+  @DocsEditable()
+  num get scrollHeight => _blink.Native_Element_scrollHeight_Getter(this);
+
+  @DomName('Element.scrollLeft')
+  @DocsEditable()
+  num get scrollLeft => _blink.Native_Element_scrollLeft_Getter(this);
+
+  @DomName('Element.scrollLeft')
+  @DocsEditable()
+  void set scrollLeft(num value) => _blink.Native_Element_scrollLeft_Setter(this, value);
+
+  @DomName('Element.scrollTop')
+  @DocsEditable()
+  num get scrollTop => _blink.Native_Element_scrollTop_Getter(this);
+
+  @DomName('Element.scrollTop')
+  @DocsEditable()
+  void set scrollTop(num value) => _blink.Native_Element_scrollTop_Setter(this, value);
+
+  @DomName('Element.scrollWidth')
+  @DocsEditable()
+  num get scrollWidth => _blink.Native_Element_scrollWidth_Getter(this);
+
   // To suppress missing implicit constructor warnings.
   factory Element._() { throw new UnsupportedError("Not supported"); }
 
@@ -11214,19 +11262,19 @@
 
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get clientHeight => _blink.Native_Element_clientHeight_Getter(this);
+  int get _clientHeight => _blink.Native_Element_clientHeight_Getter(this);
 
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get clientLeft => _blink.Native_Element_clientLeft_Getter(this);
+  int get _clientLeft => _blink.Native_Element_clientLeft_Getter(this);
 
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get clientTop => _blink.Native_Element_clientTop_Getter(this);
+  int get _clientTop => _blink.Native_Element_clientTop_Getter(this);
 
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get clientWidth => _blink.Native_Element_clientWidth_Getter(this);
+  int get _clientWidth => _blink.Native_Element_clientWidth_Getter(this);
 
   @DomName('Element.id')
   @DocsEditable()
@@ -11256,11 +11304,11 @@
 
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get offsetHeight => _blink.Native_Element_offsetHeight_Getter(this);
+  int get _offsetHeight => _blink.Native_Element_offsetHeight_Getter(this);
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get offsetLeft => _blink.Native_Element_offsetLeft_Getter(this);
+  int get _offsetLeft => _blink.Native_Element_offsetLeft_Getter(this);
 
   @DomName('Element.offsetParent')
   @DocsEditable()
@@ -11268,11 +11316,11 @@
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get offsetTop => _blink.Native_Element_offsetTop_Getter(this);
+  int get _offsetTop => _blink.Native_Element_offsetTop_Getter(this);
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get offsetWidth => _blink.Native_Element_offsetWidth_Getter(this);
+  int get _offsetWidth => _blink.Native_Element_offsetWidth_Getter(this);
 
   @DomName('Element.outerHTML')
   @DocsEditable()
@@ -11280,27 +11328,27 @@
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get scrollHeight => _blink.Native_Element_scrollHeight_Getter(this);
+  int get _scrollHeight => _blink.Native_Element_scrollHeight_Getter(this);
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get scrollLeft => _blink.Native_Element_scrollLeft_Getter(this);
+  int get _scrollLeft => _blink.Native_Element_scrollLeft_Getter(this);
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set scrollLeft(int value) => _blink.Native_Element_scrollLeft_Setter(this, value);
+  void set _scrollLeft(int value) => _blink.Native_Element_scrollLeft_Setter(this, value);
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get scrollTop => _blink.Native_Element_scrollTop_Getter(this);
+  int get _scrollTop => _blink.Native_Element_scrollTop_Getter(this);
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set scrollTop(int value) => _blink.Native_Element_scrollTop_Setter(this, value);
+  void set _scrollTop(int value) => _blink.Native_Element_scrollTop_Setter(this, value);
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get scrollWidth => _blink.Native_Element_scrollWidth_Getter(this);
+  int get _scrollWidth => _blink.Native_Element_scrollWidth_Getter(this);
 
   @DomName('Element.shadowRoot')
   @DocsEditable()
@@ -24762,11 +24810,11 @@
 
   @DomName('ShadowRoot.applyAuthorStyles')
   @DocsEditable()
-  bool get applyAuthorStyles => _blink.Native_ShadowRoot_applyAuthorStyles_Getter(this);
+  bool get _applyAuthorStyles => _blink.Native_ShadowRoot_applyAuthorStyles_Getter(this);
 
   @DomName('ShadowRoot.applyAuthorStyles')
   @DocsEditable()
-  void set applyAuthorStyles(bool value) => _blink.Native_ShadowRoot_applyAuthorStyles_Setter(this, value);
+  void set _applyAuthorStyles(bool value) => _blink.Native_ShadowRoot_applyAuthorStyles_Setter(this, value);
 
   @DomName('ShadowRoot.host')
   @DocsEditable()
@@ -24825,27 +24873,39 @@
 
   static final bool supported = true;
 
-  static bool _resetStyleInheritanceDeprecationReported = false;
-  static void _resetStyleInheritanceDeprecationReport() {
-    if (!_resetStyleInheritanceDeprecationReported) {
+  static bool _shadowRootDeprecationReported = false;
+  static void _shadowRootDeprecationReport() {
+    if (!_shadowRootDeprecationReported) {
       window.console.warn('''
-ShadowRoot.resetStyleInheritance is now deprecated in dart:html.
-Please remove from your code.
+ShadowRoot.resetStyleInheritance and ShadowRoot.applyAuthorStyles now deprecated in dart:html.
+Please remove them from your code.
 ''');
-      _resetStyleInheritanceDeprecationReported = true;
+      _shadowRootDeprecationReported = true;
     }
   }
 
   @deprecated
   bool get resetStyleInheritance {
-    _resetStyleInheritanceDeprecationReport();
+    _shadowRootDeprecationReport();
     // Default value from when it was specified.
     return false;
   }
 
   @deprecated
   void set resetStyleInheritance(bool value) {
-    _resetStyleInheritanceDeprecationReport();
+    _shadowRootDeprecationReport();
+  }
+
+  @deprecated
+  bool get applyAuthorStyles {
+    _shadowRootDeprecationReport();
+    // Default value from when it was specified.
+    return false;
+  }
+
+  @deprecated
+  void set applyAuthorStyles(bool value) {
+    _shadowRootDeprecationReport();
   }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 5b4cddb..cd1ad33 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -556,18 +556,62 @@
 }
 
 
-class _RandomAccessFile implements RandomAccessFile {
+class _RandomAccessFile
+    extends Object with _ServiceObject
+    implements RandomAccessFile {
+  // Use default Map so we keep order.
+  static Map<int, _RandomAccessFile> _files = new Map<int, _RandomAccessFile>();
+
   final String path;
   int _id;
   bool _asyncDispatched = false;
   SendPort _fileService;
 
-  _RandomAccessFile(this._id, this.path);
+  int _totalRead = 0;
+  int _totalWritten = 0;
+  int _readCount = 0;
+  int _writeCount = 0;
+
+
+  _RandomAccessFile(this._id, this.path) {
+    _files[_serviceId] = this;
+  }
+
+  String get _serviceTypePath => 'io/file/randomaccessfiles';
+  String get _serviceTypeName => 'RandomAccessFile';
+
+  Map _toJSON(bool ref) {
+    var r = {
+      'id': _servicePath,
+      'type': _serviceType(ref),
+      'name': '$path',
+      'user_name': '$path',
+    };
+    if (ref) {
+      return r;
+    }
+    r['asyncDispatched'] = _asyncDispatched;
+    r['fd'] = _getFD(_id);
+    r['totalRead'] = _totalRead;
+    r['totalWritten'] = _totalWritten;
+    r['readCount'] = _totalWritten;
+    r['writeCount'] = _writeCount;
+    return r;
+  }
+
+  void _maybePerformCleanup() {
+    if (closed) {
+      _files.remove(_serviceId);
+    }
+  }
+
+  external static int _getFD(int id);
 
   Future<RandomAccessFile> close() {
     return _dispatch(_FILE_CLOSE, [_id], markClosed: true).then((result) {
       if (result != -1) {
         _id = result;
+        _maybePerformCleanup();
         return this;
       } else {
         throw new FileSystemException("Cannot close file", path);
@@ -584,6 +628,7 @@
       throw new FileSystemException("Cannot close file", path);
     }
     _id = id;
+    _maybePerformCleanup();
   }
 
   Future<int> readByte() {
@@ -591,6 +636,8 @@
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "readByte failed", path);
       }
+      _readCount++;
+      _totalRead++;
       return response;
     });
   }
@@ -603,6 +650,8 @@
     if (result is OSError) {
       throw new FileSystemException("readByte failed", path, result);
     }
+    _readCount++;
+    _totalRead++;
     return result;
   }
 
@@ -614,6 +663,8 @@
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "read failed", path);
       }
+      _readCount++;
+      _totalRead += response[1].length;
       return response[1];
     });
   }
@@ -629,6 +680,8 @@
     if (result is OSError) {
       throw new FileSystemException("readSync failed", path, result);
     }
+    _readCount++;
+    _totalRead += result.length;
     return result;
   }
 
@@ -648,6 +701,8 @@
       var read = response[1];
       var data = response[2];
       buffer.setRange(start, start + read, data);
+      _readCount++;
+      _totalRead += read;
       return read;
     });
   }
@@ -677,6 +732,8 @@
     if (result is OSError) {
       throw new FileSystemException("readInto failed", path, result);
     }
+    _readCount++;
+    _totalRead += result;
     return result;
   }
 
@@ -688,6 +745,8 @@
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "writeByte failed", path);
       }
+      _writeCount++;
+      _totalWritten++;
       return this;
     });
   }
@@ -703,6 +762,8 @@
     if (result is OSError) {
       throw new FileSystemException("writeByte failed", path, result);
     }
+    _writeCount++;
+    _totalWritten++;
     return result;
   }
 
@@ -729,6 +790,8 @@
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "writeFrom failed", path);
       }
+      _writeCount++;
+      _totalWritten += end - (start - result.start);
       return this;
     });
   }
@@ -755,6 +818,8 @@
     if (result is OSError) {
       throw new FileSystemException("writeFrom failed", path, result);
     }
+    _writeCount++;
+    _totalWritten += end - (start - bufferAndStart.start);
   }
 
   Future<RandomAccessFile> writeString(String string,
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index e9b610e..2af9f6c 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -1502,12 +1502,62 @@
 }
 
 
+class _ConnectionTarget {
+  // Unique key for this connection target.
+  final String key;
+  final Set<_HttpClientConnection> _idle = new HashSet();
+  final Set<_HttpClientConnection> _active = new HashSet();
+
+  _ConnectionTarget(this.key);
+
+  bool get isEmpty => _idle.isEmpty && _active.isEmpty;
+
+  bool get hasIdle => _idle.isNotEmpty;
+
+  bool get hasActive => _active.isNotEmpty;
+
+  _HttpClientConnection takeIdle() {
+    assert(hasIdle);
+    _HttpClientConnection connection = _idle.first;
+    _idle.remove(connection);
+    connection.stopTimer();
+    _active.add(connection);
+    return connection;
+  }
+
+  void addNewActive(_HttpClientConnection connection) {
+    _active.add(connection);
+  }
+
+  void returnConnection(_HttpClientConnection connection) {
+    assert(_active.contains(connection));
+    _active.remove(connection);
+    _idle.add(connection);
+  }
+
+  void connectionClosed(_HttpClientConnection connection) {
+    assert(!_active.contains(connection) || !_idle.contains(connection));
+    _active.remove(connection);
+    _idle.remove(connection);
+  }
+
+  void close(bool force) {
+    for (var c in _idle.toList()) {
+      c.close();
+    }
+    if (force) {
+      for (var c in _active.toList()) {
+        c.destroy();
+      }
+    }
+  }
+}
+
+
 class _HttpClient implements HttpClient {
   bool _closing = false;
-  final Map<String, Set<_HttpClientConnection>> _idleConnections
-      = new HashMap<String, Set<_HttpClientConnection>>();
-  final Map<String, Set<_HttpClientConnection>> _activeConnections
-      = new HashMap<String, Set<_HttpClientConnection>>();
+  final Map<String, _ConnectionTarget> _connectionTargets
+      = new HashMap<String, _ConnectionTarget>();
   final List<_Credentials> _credentials = [];
   final List<_ProxyCredentials> _proxyCredentials = [];
   Function _authenticate;
@@ -1524,12 +1574,13 @@
 
   void set idleTimeout(Duration timeout) {
     _idleTimeout = timeout;
-    _idleConnections.values.forEach(
-        (l) => l.forEach((c) {
-          // Reset timer. This is fine, as it's not happening often.
-          c.stopTimer();
-          c.startTimer();
-        }));
+    for (var c in _connectionTargets.values) {
+      for (var idle in c.idle) {
+        // Reset timer. This is fine, as it's not happening often.
+        idle.stopTimer();
+        idle.startTimer();
+      }
+    }
   }
 
   set badCertificateCallback(bool callback(X509Certificate cert,
@@ -1585,26 +1636,9 @@
 
   void close({bool force: false}) {
     _closing = true;
-    // Create flattened copy of _idleConnections, as 'destory' will manipulate
-    // it.
-    var idle = _idleConnections.values.fold(
-        [],
-        (l, e) {
-          l.addAll(e);
-          return l;
-        });
-    idle.forEach((e) {
-      e.close();
-    });
-    assert(_idleConnections.isEmpty);
-    if (force) {
-      for (var connection in
-           _activeConnections.values.expand((s) => s).toList()) {
-        connection.destroy();
-      }
-      assert(_activeConnections.isEmpty);
-      _activeConnections.clear();
-    }
+    _connectionTargets.values.toList().forEach((c) => c.close(force));
+    assert(!_connectionTargets.values.any((s) => s.hasIdle));
+    assert(!force || _connectionTargets.isEmpty);
   }
 
   set authenticate(Future<bool> f(Uri url, String scheme, String realm)) {
@@ -1703,18 +1737,7 @@
 
   // Return a live connection to the idle pool.
   void _returnConnection(_HttpClientConnection connection) {
-    var key = connection.key;
-    _activeConnections[key].remove(connection);
-    if (_activeConnections[key].isEmpty) {
-      _activeConnections.remove(key);
-    }
-    if (_closing) {
-      connection.close();
-      return;
-    }
-    _idleConnections
-        .putIfAbsent(key, () => new HashSet())
-        .add(connection);
+    _connectionTargets[connection.key].returnConnection(connection);
     connection.startTimer();
     _updateTimers();
   }
@@ -1722,28 +1745,26 @@
   // Remove a closed connnection from the active set.
   void _connectionClosed(_HttpClientConnection connection) {
     connection.stopTimer();
-    var key = connection.key;
-    if (_activeConnections.containsKey(key)) {
-      _activeConnections[key].remove(connection);
-      if (_activeConnections[key].isEmpty) {
-        _activeConnections.remove(key);
+    var connectionTarget = _connectionTargets[connection.key];
+    if (connectionTarget != null) {
+      connectionTarget.connectionClosed(connection);
+      if (connectionTarget.isEmpty) {
+        _connectionTargets.remove(connection.key);
       }
+      _updateTimers();
     }
-    if (_idleConnections.containsKey(key)) {
-      _idleConnections[key].remove(connection);
-      if (_idleConnections[key].isEmpty) {
-        _idleConnections.remove(key);
-      }
-    }
-    _updateTimers();
   }
 
   void _updateTimers() {
-    if (_activeConnections.isEmpty) {
-      if (!_idleConnections.isEmpty && _noActiveTimer == null) {
+    bool hasActive = _connectionTargets.values.any((t) => t.hasActive);
+    if (!hasActive) {
+      bool hasIdle = _connectionTargets.values.any((t) => t.hasIdle);
+      if (hasIdle && _noActiveTimer == null) {
         _noActiveTimer = new Timer(const Duration(milliseconds: 100), () {
           _noActiveTimer = null;
-          if (_activeConnections.isEmpty) {
+          bool hasActive =
+              _connectionTargets.values.any((t) => t.hasActive);
+          if (!hasActive) {
             close();
             _closing = false;
           }
@@ -1769,16 +1790,9 @@
       String host = proxy.isDirect ? uriHost: proxy.host;
       int port = proxy.isDirect ? uriPort: proxy.port;
       String key = _HttpClientConnection.makeKey(isSecure, host, port);
-      if (_idleConnections.containsKey(key)) {
-        var connection = _idleConnections[key].first;
-        _idleConnections[key].remove(connection);
-        if (_idleConnections[key].isEmpty) {
-          _idleConnections.remove(key);
-        }
-        connection.stopTimer();
-        _activeConnections
-            .putIfAbsent(key, () => new HashSet())
-            .add(connection);
+      var connectionTarget = _connectionTargets[key];
+      if (connectionTarget != null && connectionTarget.hasIdle) {
+        var connection = connectionTarget.takeIdle();
         _updateTimers();
         return new Future.value(new _ConnnectionInfo(connection, proxy));
       }
@@ -1800,15 +1814,16 @@
             return connection.createProxyTunnel(
                 uriHost, uriPort, proxy, callback)
                 .then((tunnel) {
-                  _activeConnections
-                      .putIfAbsent(tunnel.key, () => new HashSet())
-                      .add(tunnel);
+                  var connectionTarget = _connectionTargets
+                      .putIfAbsent(tunnel.key,
+                                   () => new _ConnectionTarget(tunnel.key));
+                  connectionTarget.addNewActive(tunnel);
                   return new _ConnnectionInfo(tunnel, proxy);
                 });
           } else {
-            _activeConnections
-                .putIfAbsent(key, () => new HashSet())
-                .add(connection);
+            var connectionTarget = _connectionTargets
+                .putIfAbsent(key, () => new _ConnectionTarget(key));
+            connectionTarget.addNewActive(connection);
             return new _ConnnectionInfo(connection, proxy);
           }
         }, onError: (error) {
@@ -2041,9 +2056,6 @@
   // Use default Map so we keep order.
   static Map<int, _HttpServer> _servers = new Map<int, _HttpServer>();
 
-  final String _serviceTypePath = 'io/http/servers';
-  final String _serviceTypeName = 'HttpServer';
-
   String serverHeader;
 
   Duration _idleTimeout;
@@ -2076,6 +2088,7 @@
                                                     onCancel: close);
     idleTimeout = const Duration(seconds: 120);
     _servers[_serviceId] = this;
+    _serverSocket._owner = this;
   }
 
   _HttpServer.listenOn(this._serverSocket) : _closeServer = false {
@@ -2083,6 +2096,7 @@
                                                     onCancel: close);
     idleTimeout = const Duration(seconds: 120);
     _servers[_serviceId] = this;
+    try { _serverSocket._owner = this; } catch (_) {}
   }
 
   Duration get idleTimeout => _idleTimeout;
@@ -2178,7 +2192,17 @@
     _sessionManager.sessionTimeout = timeout;
   }
 
-  void _handleRequest(HttpRequest request) => _controller.add(request);
+  void _handleRequest(_HttpRequest request) {
+    // Delay the request until the isolate's message-queue is handled.
+    // This greatly improves scheduling when a lot of requests are active.
+    Timer.run(() {
+      if (!closed) {
+        _controller.add(request);
+      } else {
+        request._httpConnection.destroy();
+      }
+    });
+  }
 
   void _handleError(error) {
     if (!closed) _controller.addError(error);
@@ -2226,6 +2250,9 @@
     return result;
   }
 
+  String get _serviceTypePath => 'io/http/servers';
+  String get _serviceTypeName => 'HttpServer';
+
   Map _toJSON(bool ref) {
     var r = {
       'id': _servicePath,
@@ -2236,6 +2263,16 @@
     if (ref) {
       return r;
     }
+    try {
+      r['socket'] = _serverSocket._toJSON(true);
+    } catch (_) {
+      r['socket'] = {
+        'id': _servicePath,
+        'type': '@Socket',
+        'name': 'UserSocket',
+        'user_name': 'UserSocket',
+      };
+    }
     r['port'] = port;
     r['address'] = address.host;
     r['active'] = _activeConnections.length;
@@ -2366,7 +2403,7 @@
 
 class _DetachedSocket extends Stream<List<int>> implements Socket {
   final Stream<List<int>> _incoming;
-  final Socket _socket;
+  final _socket;
 
   _DetachedSocket(this._socket, this._incoming);
 
@@ -2424,6 +2461,9 @@
   bool setOption(SocketOption option, bool enabled) {
     return _socket.setOption(option, enabled);
   }
+
+  Map _toJSON(bool ref) => _socket._toJSON(ref);
+  void set _owner(owner) { _socket._owner = owner; }
 }
 
 
diff --git a/sdk/lib/io/secure_server_socket.dart b/sdk/lib/io/secure_server_socket.dart
index 4b64fe3..e5fa60f 100644
--- a/sdk/lib/io/secure_server_socket.dart
+++ b/sdk/lib/io/secure_server_socket.dart
@@ -104,6 +104,8 @@
    * is fully closed and is no longer bound.
    */
   Future<SecureServerSocket> close() => _socket.close().then((_) => this);
+
+  void set _owner(owner) { _socket._owner = owner; }
 }
 
 
@@ -278,6 +280,8 @@
       close();
     }
   }
+
+  void set _owner(owner) { (_socket as dynamic)._owner = owner; }
 }
 
 
diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
index 475c8f4..708af8a 100644
--- a/sdk/lib/io/websocket_impl.dart
+++ b/sdk/lib/io/websocket_impl.dart
@@ -741,14 +741,17 @@
 }
 
 
-class _WebSocketImpl extends Stream implements WebSocket {
+class _WebSocketImpl extends Stream with _ServiceObject implements WebSocket {
+  // Use default Map so we keep order.
+  static Map<int, _WebSocketImpl> _webSockets = new Map<int, _WebSocketImpl>();
+
   final String protocol;
 
   StreamController _controller;
   StreamSubscription _subscription;
   StreamSink _sink;
 
-  final Socket _socket;
+  final _socket;
   final bool _serverSide;
   int _readyState = WebSocket.CONNECTING;
   bool _writeClosed = false;
@@ -892,6 +895,9 @@
                                        onListen: _subscription.resume,
                                        onPause: _subscription.pause,
                                        onResume: _subscription.resume);
+
+    _webSockets[_serviceId] = this;
+    try { _socket._owner = this; } catch (_) {}
   }
 
   StreamSubscription listen(void onData(message),
@@ -951,6 +957,7 @@
         _closeReason = _outCloseReason;
         _subscription.cancel();
         _controller.close();
+        _webSockets.remove(_serviceId);
       });
     }
     return _sink.close();
@@ -964,6 +971,34 @@
     }
     _writeClosed = true;
     _consumer.closeSocket();
+    _webSockets.remove(_serviceId);
+  }
+
+  String get _serviceTypePath => 'io/websockets';
+  String get _serviceTypeName => 'WebSocket';
+
+  Map _toJSON(bool ref) {
+    var name = '${_socket.address.host}:${_socket.port}';
+    var r = {
+      'id': _servicePath,
+      'type': _serviceType(ref),
+      'name': name,
+      'user_name': name,
+    };
+    if (ref) {
+      return r;
+    }
+    try {
+      r['socket'] = _socket._toJSON(true);
+    } catch (_) {
+      r['socket'] = {
+        'id': _servicePath,
+        'type': '@Socket',
+        'name': 'UserSocket',
+        'user_name': 'UserSocket',
+      };
+    }
+    return r;
   }
 
   static bool _isReservedStatusCode(int code) {
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 4a4a104..4683218 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -143,14 +143,13 @@
    */
   Capability pause([Capability resumeCapability]) {
     if (resumeCapability == null) resumeCapability = new Capability();
-    var message = new List(3)
-        ..[0] = "pause"
-        ..[1] = pauseCapability
-        ..[2] = resumeCapability;
-    controlPort.send(message);
+    _pause(resumeCapability);
     return resumeCapability;
   }
 
+  /** Internal implementation of [pause]. */
+  external void _pause(Capability resumeCapability);
+
   /**
    * Resumes a paused isolate.
    *
@@ -165,12 +164,7 @@
    * The capability must be one returned by a call to [pause] on this
    * isolate, otherwise the resume call does nothing.
    */
-  void resume(Capability resumeCapability) {
-    var message = new List(2)
-        ..[0] = "resume"
-        ..[1] = resumeCapability;
-    controlPort.send(message);
-  }
+  external void resume(Capability resumeCapability);
 
   /**
    * Asks the isolate to send a message on [responsePort] when it terminates.
@@ -182,17 +176,11 @@
    * has been sent.
    *
    * If the isolate is already dead, no message will be sent.
-   * TODO(lrn): Can we do better? Can the system recognize this message and
+   */
+  /* TODO(lrn): Can we do better? Can the system recognize this message and
    * send a reply if the receiving isolate is dead?
    */
-  void addOnExitListener(SendPort responsePort) {
-    // TODO(lrn): Can we have an internal method that checks if the receiving
-    // isolate of a SendPort is still alive?
-    var message = new List(2)
-        ..[0] = "add-ondone"
-        ..[1] = responsePort;
-    controlPort.send(message);
-  }
+  external void addOnExitListener(SendPort responsePort);
 
   /**
    * Stop listening on exit messages from the isolate.
@@ -205,12 +193,7 @@
    * A response may still be sent until this operation is fully processed by
    * the isolate.
    */
-  void removeOnExitListener(SendPort responsePort) {
-    var message = new List(2)
-        ..[0] = "remove-ondone"
-        ..[1] = responsePort;
-    controlPort.send(message);
-  }
+  external void removeOnExitListener(SendPort responsePort);
 
   /**
    * Set whether uncaught errors will terminate the isolate.
@@ -223,13 +206,7 @@
    * This call requires the [terminateCapability] for the isolate.
    * If the capability is not correct, no change is made.
    */
-  void setErrorsFatal(bool errorsAreFatal) {
-    var message = new List(3)
-        ..[0] = "set-errors-fatal"
-        ..[1] = terminateCapability
-        ..[2] = errorsAreFatal;
-    controlPort.send(message);
-  }
+  external void setErrorsFatal(bool errorsAreFatal);
 
   /**
    * Requests the isolate to shut down.
@@ -262,9 +239,7 @@
    *     messages that affect normal events, including `pause`.
    *     This can be used to wait for a another event to be processed.
    */
-  void kill([int priority = BEFORE_NEXT_EVENT]) {
-    controlPort.send(["kill", terminateCapability, priority]);
-  }
+  external void kill([int priority = BEFORE_NEXT_EVENT]);
 
   /**
    * Request that the isolate send a response on the [responsePort].
@@ -292,17 +267,13 @@
    *     messages that affect normal events, including `pause`.
    *     This can be used to wait for a another event to be processed.
    */
-  void ping(SendPort responsePort, [int pingType = IMMEDIATE]) {
-    var message = new List(3)
-        ..[0] = "ping"
-        ..[1] = responsePort
-        ..[2] = pingType;
-    controlPort.send(message);
-  }
+  external void ping(SendPort responsePort, [int pingType = IMMEDIATE]);
 
   /**
    * Requests that uncaught errors of the isolate are sent back to [port].
    *
+   * WARNING: This method is experimental and not handled on every platform yet.
+   *
    * The errors are sent back as two elements lists.
    * The first element is a `String` representation of the error, usually
    * created by calling `toString` on the error.
@@ -312,16 +283,13 @@
    * Listening using the same port more than once does nothing. It will only
    * get each error once.
    */
-  void addErrorListener(SendPort port) {
-    var message = new List(2)
-        ..[0] = "getErrors"
-        ..[1] = port;
-    controlPort.send(message);
-  }
+  external void addErrorListener(SendPort port);
 
   /**
    * Stop listening for uncaught errors through [port].
    *
+   * WARNING: This method is experimental and not handled on every platform yet.
+   *
    * The `port` should be a port that is listening for errors through
    * [addErrorListener]. This call requests that the isolate stops sending
    * errors on the port.
@@ -333,12 +301,7 @@
    * Closing the receive port at the end of the send port will not stop the
    * isolate from sending errors, they are just going to be lost.
    */
-  void removeErrorListener(SendPort port) {
-    var message = new List(2)
-        ..[0] = "stopErrors"
-        ..[1] = port;
-    controlPort.send(message);
-  }
+  external void removeErrorListener(SendPort port);
 
   /**
    * Returns a broadcast stream of uncaught errors from the isolate.
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index 7fb810e..6d7717b 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -518,11 +518,6 @@
    */
   InstanceMirror apply(List positionalArguments,
                        [Map<Symbol, dynamic> namedArguments]);
-
-  /**
-   * Not yet supported. Calling this method throws an [UnsupportedError].
-   */
-  InstanceMirror findInContext(Symbol name, {ifAbsent: null});
 }
 
 /**
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index c532b40..a421a89 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -15,6 +15,10 @@
 
 LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19 issue 668
 
+# These tests are obsolete and need updating.
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-002_t01: Skip # Issue 19019
+WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-003_t01: Skip # Issue 19019
+
 [ $compiler != dartanalyzer && $compiler != dart2analyzer ]
 # Tests that fail on every runtime, but not on the analyzer.
 LibTest/isolate/ReceivePort/asBroadcastStream_A02_t01: Fail # co19 issue 687
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 2cfa47a..feaa25a 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -117,6 +117,7 @@
 
 LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError # Issue 19055.
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
@@ -124,6 +125,8 @@
 LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/Element/scrollWidth_t01: RuntimeError # Issue 19055.
+LayoutTests/fast/html/details-click-controls_t01: RuntimeError # Issue 19055.
 LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/html/imports/import-element-removed-flag_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/html/imports/import-events_t01: RuntimeError # Issue 17758.  Please triage this failure.
@@ -137,6 +140,7 @@
 LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/dataset_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/getAttributeNS_A01_t02: RuntimeError # Issue 19055.
 LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
@@ -240,6 +244,7 @@
 LibTest/html/Node/nodes_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Node/parent_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Node/previousNode_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/custom-elements/concepts/type_A03_t01: RuntimeError # Issue 19055.
 WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -283,7 +288,21 @@
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # Issue 19055.
 WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-007_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-008_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-009_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-010_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-011_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-012_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-013_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-014_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-015_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-016_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-018_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-019_t01: RuntimeError # Issue 19055.
+WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-020_t01: RuntimeError # Issue 19055.
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Skip # co19-roll r722: Please triage this failure.
@@ -295,6 +314,7 @@
 LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/remove-element-from-within-focus-handler-crash_t01: RuntimeError # Issue 19055.
 LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -303,13 +323,16 @@
 LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Issue 19055.
+LayoutTests/fast/dom/Range/range-comparePoint_t01: RuntimeError # Issue 19055.
 LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # Issue 19055.
+LayoutTests/fast/dom/Range/range-isPointInRange_t01: RuntimeError # Issue 19055.
 LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/Utils/test/asyncTestTimeout_t01: Skip # co19-roll r722: Please triage this failure.
@@ -330,19 +353,14 @@
 WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError # Issue 19055.
 WebPlatformTest/dom/nodes/Node-replaceChild_t01: RuntimeError # co19-roll r722: Please triage this failure
 WebPlatformTest/dom/nodes/Node-textContent_t01: RuntimeError # Issue 18931
-WebPlatformTest/dom/nodes/attributes/attributes_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/attributes_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t02: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t02: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-005_t01: RuntimeError # Issue 18931
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-006_t01: RuntimeError # Issue 18931
diff --git a/tests/compiler/dart2js/analyze_api_test.dart b/tests/compiler/dart2js/analyze_api_test.dart
index de48a2e..3ecf592 100644
--- a/tests/compiler/dart2js/analyze_api_test.dart
+++ b/tests/compiler/dart2js/analyze_api_test.dart
@@ -20,6 +20,7 @@
 // TODO(johnniwinther): Support canonical URIs as keys and message kinds as
 // values.
 const Map<String, List<String>> WHITE_LIST = const {
+  "js_mirrors.dart" : const ["Unreachable code."] // issue 18936
 };
 
 void main() {
diff --git a/tests/compiler/dart2js/command_line_split_test.dart b/tests/compiler/dart2js/command_line_split_test.dart
index 22e5b88..8e21815 100644
--- a/tests/compiler/dart2js/command_line_split_test.dart
+++ b/tests/compiler/dart2js/command_line_split_test.dart
@@ -7,10 +7,45 @@
 
 main() {
   Expect.listEquals(["foo", "bar"], splitLine("foo bar"));
+  Expect.listEquals(["foo", "bar"], splitLine("foo bar", windows: true));
+
   Expect.listEquals(["foo bar"], splitLine(r"foo\ bar"));
+  Expect.listEquals(["foo\\", "bar"], splitLine(r"foo\ bar", windows: true));
+
   Expect.listEquals(["foo'", '"bar'], splitLine(r"""foo\' \"bar"""));
+  Expect.listEquals(["foo\\'", '"bar'],
+                    splitLine(r"""foo\' \"bar""", windows: true));
+
   Expect.listEquals(["foo'", '"bar'], splitLine(r"""foo"'" '"'bar"""));
+  Expect.throws(() => splitLine(r"""foo"'" '"'bar""", windows: true),
+                (e) => e is FormatException);
+  Expect.listEquals(["foo'", "''bar"],
+                    splitLine(r"""foo"'" '"'bar" """, windows: true));
+
   Expect.listEquals(["foo", "bar"], splitLine("'f''o''o' " + '"b""a""r"'));
-  Expect.listEquals(["\n", "\t", "\t", "\b", "\f", "\v", "\\", "a", "Z", "-"],
-                    splitLine(r"\n \t \t \b \f \v \\ \a \Z \-"));
+  // TODO(johnniwinther): This is not actual Windows behavior: "b""a" is
+  // interpreted as b"a but "b""a""r" is interpreted as b"ar.
+  Expect.listEquals(["'f''o''o'", "bar"],
+                    splitLine("'f''o''o' " + '"b""a""r"', windows: true));
+
+  Expect.listEquals(["\n", "\r", "\t", "\b", "\f", "\v", "\\",
+                     "a", "Z", "-", '"', "'"],
+                    splitLine(r"""\n \r \t \b \f \v \\ \a \Z \- \" \'"""));
+  Expect.listEquals(["\\n", "\\r", "\\t", "\\b", "\\f", "\\v",
+                     "\\", "\\a", "\\Z", "\\-", '"', "\\'"],
+                    splitLine(r"""\n \r \t \b \f \v \\ \a \Z \- \" \'""",
+                              windows: true));
+  Expect.listEquals(["C:Users\foo\bar\baz.dart"],
+      splitLine(r"C:\Users\foo\bar\baz.dart"));
+  Expect.listEquals([r"C:\Users\foo\bar\baz.dart"],
+      splitLine(r"C:\Users\foo\bar\baz.dart", windows: true));
+
+  Expect.listEquals(["C:Users\foo\bar\name with spaces.dart"],
+      splitLine(r'"C:\Users\foo\bar\name with spaces.dart"'));
+  Expect.listEquals([r"C:\Users\foo\bar\name with spaces.dart"],
+      splitLine(r'"C:\Users\foo\bar\name with spaces.dart"', windows: true));
+
+  Expect.throws(() => splitLine(r"\"), (e) => e is FormatException);
+  Expect.throws(() => splitLine(r"\", windows: true),
+                (e) => e is FormatException);
 }
diff --git a/tests/compiler/dart2js/dart2js_batch_test.dart b/tests/compiler/dart2js/dart2js_batch_test.dart
index fab3d8c..5fc06a0 100644
--- a/tests/compiler/dart2js/dart2js_batch_test.dart
+++ b/tests/compiler/dart2js/dart2js_batch_test.dart
@@ -64,24 +64,24 @@
   String outFile = path.join(tmpDir.path, 'out.js');
   String outFile2 = path.join(tmpDir.path, 'out2.js');
 
-  process.stdin.writeln("--out='$outFile' '$inFile'");
-  process.stdin.writeln("--out='$outFile2' '$inFile'");
-  process.stdin.writeln("too many arguments");
-  process.stdin.writeln(r"non\ existing\ file.dart");
+  process.stdin.writeln('--out="$outFile" "$inFile"');
+  process.stdin.writeln('--out="$outFile2" "$inFile"');
+  process.stdin.writeln('too many arguments');
+  process.stdin.writeln(r'"non existing file.dart"');
   process.stdin.close();
   Future<String> output = process.stdout.transform(UTF8.decoder).join();
   Future<String> errorOut = process.stderr.transform(UTF8.decoder).join();
   return Future.wait([output, errorOut])
         .then((result) {
       String stdoutOutput = result[0];
+      print('out:\n$stdoutOutput');
       String stderrOutput = result[1];
-      Expect.equals("""
->>> EOF STDERR
->>> EOF STDERR
->>> EOF STDERR
->>> EOF STDERR
-""", stderrOutput);
-      Expect.isTrue(stdoutOutput.startsWith(">>> TEST OK\n>>> TEST OK\n"));
+      print('err:\n$stderrOutput');
+
+      Expect.equals(4, ">>> EOF STDERR".allMatches(stderrOutput).length);
+      Expect.equals(4, ">>>".allMatches(stderrOutput).length);
+
+      Expect.equals(2, ">>> TEST OK".allMatches(stdoutOutput).length);
       Expect.equals(2, ">>> TEST FAIL".allMatches(stdoutOutput).length);
       Expect.equals(4, ">>>".allMatches(stdoutOutput).length);
     });
diff --git a/tests/compiler/dart2js_extra/16400_test.dart b/tests/compiler/dart2js_extra/16400_test.dart
new file mode 100644
index 0000000..221eaac
--- /dev/null
+++ b/tests/compiler/dart2js_extra/16400_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+main() {
+  L: {
+    var seeMe = 0;
+    if (seeMe == 0) {
+      ++seeMe;
+      break L;
+    }
+    var wontSeeMe = 2;
+    if (seeMe + wontSeeMe == 2) {
+      return true;
+    } else {
+      return false;
+    }
+  }
+}
+
diff --git a/tests/html/audiocontext_test.dart b/tests/html/audiocontext_test.dart
index 81e4e5f..948f543 100644
--- a/tests/html/audiocontext_test.dart
+++ b/tests/html/audiocontext_test.dart
@@ -28,21 +28,6 @@
       }
     });
 
-    test('createBuffer', () {
-      if(AudioContext.supported) {
-        var ctx = new AudioContext();
-        Float32List view = new Float32List.fromList([]);
-        try {
-          // Test that native overload is chosen correctly. Native
-          // implementation should throw 'SyntaxError' DomException because the
-          // buffer is empty.
-          AudioBuffer buffer = ctx.createBufferFromBuffer(view.buffer, false);
-        } catch (e) {
-          expect(e.name, DomException.SYNTAX);
-        }
-      }
-    });
-
     test('audioRenames', () {
       if(AudioContext.supported) {
         AudioContext context = new AudioContext();
@@ -98,9 +83,6 @@
         oscillator.type = 'triangle';
         expect(oscillator.type, equals('triangle'));
 
-        expect(() => oscillator.type = 'somethingUnsupported', throws);
-        expect(oscillator.type, equals('triangle'));
-
         expect(() => oscillator.type = 7, throws);
         expect(oscillator.type, equals('triangle'));
 
diff --git a/tests/html/worker_test.dart b/tests/html/worker_test.dart
index 896781f..dccb8b5 100644
--- a/tests/html/worker_test.dart
+++ b/tests/html/worker_test.dart
@@ -21,11 +21,17 @@
   group('functional', () {
 
     test('unsupported', () {
-      var expectation = Worker.supported ? returnsNormally : throws;
-
-      expect(() {
-        new Worker('worker.js');
-      }, expectation);
+      if (!Worker.supported) {
+        expect(() => new Worker('worker.js'), throws);
+      } else {
+        new Worker('worker.js').onError.first.then(expectAsync((e) {
+          // This event is expected, "worker.js" doesn't exist.  But the event
+          // *sometimes* propagates to window.onerror in Firefox which causes
+          // this test to fail, so let's stop any further propagation:
+          e.preventDefault();
+          e.stopImmediatePropagation();
+        }));
+      }
     });
 
     if (!Worker.supported) {
diff --git a/tests/html/xhr_test.dart b/tests/html/xhr_test.dart
index d475529..5759222 100644
--- a/tests/html/xhr_test.dart
+++ b/tests/html/xhr_test.dart
@@ -28,7 +28,10 @@
 
   void validate404(xhr) {
     expect(xhr.status, equals(404));
-    expect(xhr.responseText, equals(''));
+    // We cannot say much about xhr.responseText, most HTTP servers will
+    // include an HTML page explaining the error to a human.
+    String responseText = xhr.responseText;
+    expect(responseText, isNotNull);
   }
 
   group('supported_onProgress', () {
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 1f685bf..08ba971 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -12,19 +12,19 @@
 [ $compiler == none || $compiler == dart2dart ]
 serialization_test: SkipByDesign # Tests dart2js-specific serialization code
 compile_time_error_test/01: Skip # Issue 12587
-capability_test: Fail   # Not implemented yet
-pause_test: Fail        # Not implemented yet
-start_paused_test: Fail # Not implemented yet
-ondone_test: Skip       # Not implemented yet, hangs.
-ping_test: Fail         # Not implemented yet
-ping_pause_test: Fail   # Not implemented yet
-kill_test: Skip         # Not implemented yet, hangs.
-kill2_test: Skip        # Not implemented yet, hangs.
-kill3_test: Skip        # Not implemented yet, hangs.
-kill_self_test: Skip    # Not implemented yet, hangs.
-handle_error_test: Skip # Not implemented yet, hangs.
-handle_error2_test: Skip # Not implemented yet, hangs.
-handle_error3_test: Skip # Not implemented yet, hangs.
+capability_test: Fail     # Not implemented yet
+pause_test: Fail          # Not implemented yet
+start_paused_test: Fail   # Not implemented yet
+ondone_test: Fail         # Not implemented yet
+ping_test: Fail           # Not implemented yet
+ping_pause_test: Fail     # Not implemented yet
+kill_test: Fail           # Not implemented yet
+kill2_test: Fail          # Not implemented yet
+kill3_test: Fail          # Not implemented yet
+kill_self_test: Fail      # Not implemented yet
+handle_error_test: Fail   # Not implemented yet
+handle_error2_test: Fail  # Not implemented yet
+handle_error3_test: Fail  # Not implemented yet
 
 [ $compiler == dart2js && $jscl ]
 browser/*: SkipByDesign  # Browser specific tests
@@ -90,6 +90,8 @@
 compile_time_error_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 isolate_import_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 simple_message_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
+spawn_uri_missing_from_isolate_test: RuntimeError # http://dartbug.com/17649
+spawn_uri_missing_test: Skip # Times out.
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 browser/typed_data_message_test: StaticWarning
diff --git a/tests/isolate/spawn_uri_missing_from_isolate_test.dart b/tests/isolate/spawn_uri_missing_from_isolate_test.dart
new file mode 100644
index 0000000..c7551d2
--- /dev/null
+++ b/tests/isolate/spawn_uri_missing_from_isolate_test.dart
@@ -0,0 +1,42 @@
+// 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.
+
+/// Tests that Isolate.spawnUri completes with an error when the given URI
+/// doesn't resolve to an existing resource.
+///
+/// This test is similar to spawn_uri_missing_test.dart, but tests what happens
+/// when Isolate.spawnUri is called from an a spawned isolate.  In dart2js,
+/// these two situations are different.
+library test.isolate.spawn_uri_missing_from_isolate_test;
+
+import 'dart:isolate';
+
+import 'dart:async';
+
+import 'package:async_helper/async_helper.dart';
+
+import 'spawn_uri_missing_test.dart';
+
+const String SUCCESS = 'Test worked.';
+
+void isolate(SendPort port) {
+  doTest().then(
+      (_) => port.send(SUCCESS),
+      onError: (error, stack) => port.send('Test failed: $error\n$stack'));
+}
+
+main() {
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(isolate, port.sendPort);
+  Completer completer = new Completer();
+  port.first.then((message) {
+    if (message == SUCCESS) {
+      completer.complete(null);
+    } else {
+      completer.completeError(message);
+    }
+  });
+
+  asyncTest(() => completer.future);
+}
diff --git a/tests/isolate/spawn_uri_missing_test.dart b/tests/isolate/spawn_uri_missing_test.dart
new file mode 100644
index 0000000..f342fe2
--- /dev/null
+++ b/tests/isolate/spawn_uri_missing_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+/// Tests that Isolate.spanUri completes with an error when the given URI
+/// doesn't resolve to an existing resource.
+library test.isolate.spawn_uri_missing_test;
+
+import 'dart:isolate';
+
+import 'dart:async';
+
+import 'package:async_helper/async_helper.dart';
+
+const UNEXPECTED_MESSAGE = 'Created isolate from missing file.';
+
+Future doTest() {
+  return Isolate.spawnUri(Uri.base.resolve('no_such_file'), [], null)
+      .then((Isolate isolate) {
+    throw UNEXPECTED_MESSAGE;
+  }).catchError((error) {
+    if (error == UNEXPECTED_MESSAGE) throw error;
+    print('An error was thrown as expected');
+    return null;
+  });
+}
+
+main() {
+  asyncTest(doTest);
+}
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 32d0f1c..37a431c 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -159,14 +159,6 @@
 override_inheritance_no_such_method_test/04: StaticWarning # Issue 16132
 override_inheritance_no_such_method_test/05: StaticWarning # Issue 16132
 
-# analyzer issue 17983
-override_inheritance_generic_test/08: MissingStaticWarning # Issue 17983
-override_inheritance_field_test/32: MissingStaticWarning # Issue 17983
-override_inheritance_field_test/09: MissingStaticWarning # Issue 17983
-
-# missing warning for override
-override_inheritance_generic_test/07: MissingStaticWarning # Issue 16135
-
 # The following tests are currently assumed to be failing because the test is wrong.
 #
 application_negative_test: CompileTimeError # Test Issue 14528
diff --git a/tests/language/logical_rewrite_test.dart b/tests/language/logical_rewrite_test.dart
deleted file mode 100644
index 506bff3..0000000
--- a/tests/language/logical_rewrite_test.dart
+++ /dev/null
@@ -1,111 +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:expect/expect.dart';
-
-cneg_and(x, y) {
-    if ((x && y) ? false : true) {
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-cneg_and_not(x, y) {
-    if ((x && (y ? false : true)) ? false : true) {
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-cneg_not_and(x, y) {
-    if (((x ? false : true) && y) ? false : true) {
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-cneg_not_and_not(x, y) {
-    if (((x ? false : true) && (y ? false : true)) ? false : true) {
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-cneg_or(x, y) {
-    if ((x || y) ? false : true) {
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-cneg_or_not(x, y) {
-    if ((x || (y ? false : true)) ? false : true) {
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-cneg_not_or(x, y) {
-    if (((x ? false : true) || y) ? false : true) {
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-cneg_not_or_not(x, y) {
-    if (((x ? false : true) || (y ? false : true)) ? false : true) {
-        return 0;
-    } else {
-        return 1;
-    }
-}
-
-main() {
-    Expect.equals(1, cneg_and(true, true));
-    Expect.equals(0, cneg_and(true, false));
-    Expect.equals(0, cneg_and(false, true));
-    Expect.equals(0, cneg_and(false, false));
-
-    Expect.equals(0, cneg_and_not(true, true));
-    Expect.equals(1, cneg_and_not(true, false));
-    Expect.equals(0, cneg_and_not(false, true));
-    Expect.equals(0, cneg_and_not(false, false));
-
-    Expect.equals(0, cneg_not_and(true, true));
-    Expect.equals(0, cneg_not_and(true, false));
-    Expect.equals(1, cneg_not_and(false, true));
-    Expect.equals(0, cneg_not_and(false, false));
-
-    Expect.equals(0, cneg_not_and_not(true, true));
-    Expect.equals(0, cneg_not_and_not(true, false));
-    Expect.equals(0, cneg_not_and_not(false, true));
-    Expect.equals(1, cneg_not_and_not(false, false));
-
-    Expect.equals(1, cneg_or(true, true));
-    Expect.equals(1, cneg_or(true, false));
-    Expect.equals(1, cneg_or(false, true));
-    Expect.equals(0, cneg_or(false, false));
-
-    Expect.equals(1, cneg_or_not(true, true));
-    Expect.equals(1, cneg_or_not(true, false));
-    Expect.equals(0, cneg_or_not(false, true));
-    Expect.equals(1, cneg_or_not(false, false));
-
-    Expect.equals(1, cneg_not_or(true, true));
-    Expect.equals(0, cneg_not_or(true, false));
-    Expect.equals(1, cneg_not_or(false, true));
-    Expect.equals(1, cneg_not_or(false, false));
-
-    Expect.equals(0, cneg_not_or_not(true, true));
-    Expect.equals(1, cneg_not_or_not(true, false));
-    Expect.equals(1, cneg_not_or_not(false, true));
-    Expect.equals(1, cneg_not_or_not(false, false));
-}
diff --git a/tests/language/metadata_scope1_test.dart b/tests/language/metadata_scope1_test.dart
new file mode 100644
index 0000000..e782077
--- /dev/null
+++ b/tests/language/metadata_scope1_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// Test that a type variable is not in scope for metadata declared on the type
+// declaration.
+
+@deprecated
+typedef Foo
+<deprecated>  /// 01: ok
+();
+
+main() {
+  Foo f = null;
+}
diff --git a/tests/language/metadata_scope2_test.dart b/tests/language/metadata_scope2_test.dart
new file mode 100644
index 0000000..5bf647e
--- /dev/null
+++ b/tests/language/metadata_scope2_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// Test that a type variable is not in scope for metadata declared on the type
+// declaration.
+
+@deprecated
+class Foo
+<deprecated>  /// 01: ok
+{}
+
+main() {
+  Foo f = null;
+}
diff --git a/tests/language/metadata_self_test.dart b/tests/language/metadata_self_test.dart
new file mode 100644
index 0000000..434cc38
--- /dev/null
+++ b/tests/language/metadata_self_test.dart
@@ -0,0 +1,14 @@
+// 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.
+
+// Test that metadata refer to the annotated declaration.
+
+@Foo()
+class Foo {
+  const Foo();
+}
+
+main() {
+  Foo f = const Foo();
+}
diff --git a/tests/language/optional_named_parameters_test.dart b/tests/language/optional_named_parameters_test.dart
index 770e732..8ddc127 100644
--- a/tests/language/optional_named_parameters_test.dart
+++ b/tests/language/optional_named_parameters_test.dart
@@ -103,5 +103,3 @@
 main() {
   OptionalNamedParametersTest.test();
 }
-
-// TODO(regis): negative tests: [} {] [a:0] {a=0}
diff --git a/tests/language/parameter_metadata_test.dart b/tests/language/parameter_metadata_test.dart
new file mode 100644
index 0000000..3f25690
--- /dev/null
+++ b/tests/language/parameter_metadata_test.dart
@@ -0,0 +1,19 @@
+// 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.
+
+// Test that metadata annotations can be handled on nested parameters.
+
+test(
+     @deprecated    /// 01: ok
+     f(
+       @deprecated  /// 02: ok
+       a,
+       @deprecated  /// 03: ok
+       g(
+         @deprecated /// 04: ok
+         b))) {}
+
+main() {
+  test(null);
+}
\ No newline at end of file
diff --git a/tests/language/rewrite_assign_test.dart b/tests/language/rewrite_assign_test.dart
new file mode 100644
index 0000000..5379a6c
--- /dev/null
+++ b/tests/language/rewrite_assign_test.dart
@@ -0,0 +1,26 @@
+// 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";
+
+bar(x,y) {}
+
+foo(b) {
+  var x, y;
+  if (b) {
+    x = 1;
+    y = 2;
+  } else {
+    x = 2;
+    y = 1;
+  }
+  bar(x,y);
+  bar(x,y);
+  return x;
+}
+
+main() {
+    Expect.equals(1, foo(true));
+    Expect.equals(2, foo(false));
+}
diff --git a/tests/language/rewrite_compound_assign_test.dart b/tests/language/rewrite_compound_assign_test.dart
new file mode 100644
index 0000000..b28ad96
--- /dev/null
+++ b/tests/language/rewrite_compound_assign_test.dart
@@ -0,0 +1,119 @@
+// 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";
+
+var global = 0;
+
+class Foo {
+    var field = 0;
+    static var staticField = 0;
+}
+
+field_compound1(obj) {
+    return obj.field = obj.field + 5;
+}
+field_compound2(obj) {
+    return obj.field = obj.field + 1;
+}
+field_compound3(obj) {
+    return obj.field = obj.field - 1;
+}
+field_compound4(obj) {
+    return obj.field = obj.field * 1;
+}
+
+static_compound1() {
+    return Foo.staticField = Foo.staticField + 5;
+}
+static_compound2() {
+    return Foo.staticField = Foo.staticField + 1;
+}
+static_compound3() {
+    return Foo.staticField = Foo.staticField - 1;
+}
+static_compound4() {
+    return Foo.staticField = Foo.staticField * 1;
+}
+
+global_compound1() {
+    return global = global + 5;
+}
+global_compound2() {
+    return global = global + 1;
+}
+global_compound3() {
+    return global = global - 1;
+}
+global_compound4() {
+    return global = global * 1;
+}
+
+local_compound1(x) {
+    x = x + 5;
+    if (x > 0) {
+        return x;
+    }
+    return -x;
+}
+local_compound2(x) {
+    x = x + 1;
+    if (x > 0) {
+        return x;
+    }
+    return -x;
+}
+local_compound3(x) {
+    x = x - 1;
+    if (x > 0) {
+        return x;
+    }
+    return -x;
+}
+local_compound4(x) {
+    x = x * 1;
+    if (x > 0) {
+        return x;
+    }
+    return -x;
+}
+
+main() {
+    var obj = new Foo();
+    Expect.equals(5, field_compound1(obj));
+    Expect.equals(5, obj.field);
+    Expect.equals(6, field_compound2(obj));
+    Expect.equals(6, obj.field);
+    Expect.equals(5, field_compound3(obj));
+    Expect.equals(5, obj.field);
+    Expect.equals(5, field_compound4(obj));
+    Expect.equals(5, obj.field);
+
+    Expect.equals(5, static_compound1());
+    Expect.equals(5, Foo.staticField);
+    Expect.equals(6, static_compound2());
+    Expect.equals(6, Foo.staticField);
+    Expect.equals(5, static_compound3());
+    Expect.equals(5, Foo.staticField);
+    Expect.equals(5, static_compound4());
+    Expect.equals(5, Foo.staticField);
+
+    Expect.equals(5, global_compound1());
+    Expect.equals(5, global);
+    Expect.equals(6, global_compound2());
+    Expect.equals(6, global);
+    Expect.equals(5, global_compound3());
+    Expect.equals(5, global);
+    Expect.equals(5, global_compound4());
+    Expect.equals(5, global);
+
+    Expect.equals(8, local_compound1(3));
+    Expect.equals(3, local_compound1(-8));
+    Expect.equals(4, local_compound2(3));
+    Expect.equals(7, local_compound2(-8));
+    Expect.equals(2, local_compound3(3));
+    Expect.equals(9, local_compound3(-8));
+    Expect.equals(3, local_compound4(3));
+    Expect.equals(8, local_compound4(-8));
+}
diff --git a/tests/language/rewrite_conditional_test.dart b/tests/language/rewrite_conditional_test.dart
new file mode 100644
index 0000000..057c070
--- /dev/null
+++ b/tests/language/rewrite_conditional_test.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.
+
+import 'package:expect/expect.dart';
+
+var global = 0;
+
+bar() {
+    global += 1;
+}
+baz() {
+    global += 100;
+}
+
+foo(x,y,z) {
+    if ((x ? false : true) ? y : z) {
+        bar();
+        bar();
+    } else {
+        baz();
+        baz();
+    }
+}
+
+foo2(x,y,z) {
+    return (x ? false : true) ? y : z;
+}
+
+foo3(x,y,z) {
+    if (x ? (z ? false : true) : (y ? false : true)) {
+        baz();
+        baz();
+    } else {
+        bar();
+        bar();
+    }
+}
+
+
+main() {
+    foo(true,true,true);
+    Expect.equals(2, global);
+
+    foo(true,true,false);
+    Expect.equals(202, global);
+
+    foo(true,false,true);
+    Expect.equals(204, global);
+
+    foo(true,false,false);
+    Expect.equals(404, global);
+
+    foo(false,true,true);
+    Expect.equals(406, global);
+
+    foo(false,true,false);
+    Expect.equals(408, global);
+
+    foo(false,false,true);
+    Expect.equals(608, global);
+
+    foo(false,false,false);
+    Expect.equals(808, global);
+
+    Expect.equals(true, foo2(true,true,true));
+    Expect.equals(false, foo2(true,true,false));
+    Expect.equals(true, foo2(true,false,true));
+    Expect.equals(false, foo2(true,false,false));
+    Expect.equals(true, foo2(false,true,true));
+    Expect.equals(true, foo2(false,true,false));
+    Expect.equals(false, foo2(false,false,true));
+    Expect.equals(false, foo2(false,false,false));
+
+    global = 0;
+    foo3(true,true,true);
+    Expect.equals(2, global);
+
+    foo3(true,true,false);
+    Expect.equals(202, global);
+
+    foo3(true,false,true);
+    Expect.equals(204, global);
+
+    foo3(true,false,false);
+    Expect.equals(404, global);
+
+    foo3(false,true,true);
+    Expect.equals(406, global);
+
+    foo3(false,true,false);
+    Expect.equals(408, global);
+
+    foo3(false,false,true);
+    Expect.equals(608, global);
+
+    foo3(false,false,false);
+    Expect.equals(808, global);
+}
\ No newline at end of file
diff --git a/tests/language/rewrite_if_empty_then_test.dart b/tests/language/rewrite_if_empty_then_test.dart
new file mode 100644
index 0000000..79ff882
--- /dev/null
+++ b/tests/language/rewrite_if_empty_then_test.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 "package:expect/expect.dart";
+
+var global = 0;
+
+effect() {
+    global = 1;
+}
+baz(b) { return b; }
+
+foo(b) {
+    if (b) {
+        // do nothing
+    } else {
+        effect();
+    }
+    return baz(b);
+}
+
+foo2(b) {
+    if (b) {
+        // do nothing (but implicit return may get inlined up here)
+    } else {
+        effect();
+    }
+}
+
+main() {
+    global = 0;
+    Expect.equals(true, foo(true));
+    Expect.equals(0, global);
+
+    global = 0;
+    Expect.equals(false, foo(false));
+    Expect.equals(1, global);
+
+    global = 0;
+    foo2(true);
+    Expect.equals(0, global);
+
+    global = 0;
+    foo2(false);
+    Expect.equals(1, global);
+}
diff --git a/tests/language/rewrite_if_return_test.dart b/tests/language/rewrite_if_return_test.dart
new file mode 100644
index 0000000..ae28236
--- /dev/null
+++ b/tests/language/rewrite_if_return_test.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 "package:expect/expect.dart";
+
+var global = 0;
+
+bar() {
+    global = 1;
+}
+
+baz() {
+    global = 2;
+}
+
+return_const(b) {
+    if (b) {
+        bar();
+        return 1;
+    } else {
+        baz();
+        return 1;
+    }
+}
+
+return_var(b, x) {
+    if (b) {
+        bar();
+        return x;
+    } else {
+        baz();
+        return x;
+    }
+}
+
+main() {
+    return_const(true);
+    Expect.equals(1, global);
+    return_const(false);
+    Expect.equals(2, global);
+
+    Expect.equals(4, return_var(true, 4));
+    Expect.equals(1, global);
+    Expect.equals(5, return_var(false, 5));
+    Expect.equals(2, global);
+}
diff --git a/tests/language/rewrite_if_swap_test.dart b/tests/language/rewrite_if_swap_test.dart
new file mode 100644
index 0000000..0b515bf
--- /dev/null
+++ b/tests/language/rewrite_if_swap_test.dart
@@ -0,0 +1,33 @@
+// 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";
+
+var global = 0;
+
+bar() {
+    global += 1;
+}
+baz() {
+    global += 100;
+}
+
+foo(b) {
+    var old_backend_was_used;
+    if (b ? false : true) {
+        bar();
+        bar();
+    } else {
+        baz();
+        baz();
+    }
+}
+
+main() {
+    foo(true);
+    Expect.equals(200, global);
+
+    foo(false);
+    Expect.equals(202, global);
+}
diff --git a/tests/language/rewrite_logical_test.dart b/tests/language/rewrite_logical_test.dart
new file mode 100644
index 0000000..63de643
--- /dev/null
+++ b/tests/language/rewrite_logical_test.dart
@@ -0,0 +1,297 @@
+// 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';
+
+cneg_and(x, y) {
+    if ((x && y) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_and_not(x, y) {
+    if ((x && (y ? false : true)) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_not_and(x, y) {
+    if (((x ? false : true) && y) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_not_and_not(x, y) {
+    if (((x ? false : true) && (y ? false : true)) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_or(x, y) {
+    if ((x || y) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_or_not(x, y) {
+    if ((x || (y ? false : true)) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_not_or(x, y) {
+    if (((x ? false : true) || y) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+cneg_not_or_not(x, y) {
+    if (((x ? false : true) || (y ? false : true)) ? false : true) {
+        return 0;
+    } else {
+        return 1;
+    }
+}
+
+value_tobool(x) {
+    return x ? true : false;
+}
+value_negate(x) {
+    return x ? false : true;
+}
+value_and(x,y) {
+    return x ? y ? true : false : false;
+}
+value_or(x,y) {
+    return x ? true : y ? true : false;
+}
+value_and_not(x,y) {
+    return x ? y ? false : true : false;
+}
+value_not_and(x,y) {
+    return x ? false : y ? true : false;
+}
+value_not_and_not(x,y)  {
+    return x ? false : y ? false : true;
+}
+value_or_not(x,y) {
+    return x ? true : y ? false : true;
+}
+value_not_or(x,y) {
+    return x ? y ? true : false : true;
+}
+value_not_or_not(x,y) {
+    return x ? y ? false : true : true;
+}
+
+if_negate(x) {
+    if (x ? false : true) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+if_and(x,y) {
+    if (x ? y ? true : false : false) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+if_or(x,y) {
+    if (x ? true : y) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+if_and_not(x,y) {
+    if (x ? y ? false : true : false) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+if_not_and(x,y) {
+    if (x ? false : y) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+if_not_and_not(x,y)  {
+    if (x ? false : y ? false : true) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+if_or_not(x,y) {
+    if (x ? true : y ? false : true) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+if_not_or(x,y) {
+    if (x ? y : true) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+if_not_or_not(x,y) {
+    if (x ? y ? false : true : true) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+
+main() {
+    Expect.equals(1, cneg_and(true, true));
+    Expect.equals(0, cneg_and(true, false));
+    Expect.equals(0, cneg_and(false, true));
+    Expect.equals(0, cneg_and(false, false));
+
+    Expect.equals(0, cneg_and_not(true, true));
+    Expect.equals(1, cneg_and_not(true, false));
+    Expect.equals(0, cneg_and_not(false, true));
+    Expect.equals(0, cneg_and_not(false, false));
+
+    Expect.equals(0, cneg_not_and(true, true));
+    Expect.equals(0, cneg_not_and(true, false));
+    Expect.equals(1, cneg_not_and(false, true));
+    Expect.equals(0, cneg_not_and(false, false));
+
+    Expect.equals(0, cneg_not_and_not(true, true));
+    Expect.equals(0, cneg_not_and_not(true, false));
+    Expect.equals(0, cneg_not_and_not(false, true));
+    Expect.equals(1, cneg_not_and_not(false, false));
+
+    Expect.equals(1, cneg_or(true, true));
+    Expect.equals(1, cneg_or(true, false));
+    Expect.equals(1, cneg_or(false, true));
+    Expect.equals(0, cneg_or(false, false));
+
+    Expect.equals(1, cneg_or_not(true, true));
+    Expect.equals(1, cneg_or_not(true, false));
+    Expect.equals(0, cneg_or_not(false, true));
+    Expect.equals(1, cneg_or_not(false, false));
+
+    Expect.equals(1, cneg_not_or(true, true));
+    Expect.equals(0, cneg_not_or(true, false));
+    Expect.equals(1, cneg_not_or(false, true));
+    Expect.equals(1, cneg_not_or(false, false));
+
+    Expect.equals(0, cneg_not_or_not(true, true));
+    Expect.equals(1, cneg_not_or_not(true, false));
+    Expect.equals(1, cneg_not_or_not(false, true));
+    Expect.equals(1, cneg_not_or_not(false, false));
+
+    Expect.equals(true, value_tobool(true));
+    Expect.equals(false, value_tobool(false));
+
+    Expect.equals(false, value_negate(true));
+    Expect.equals(true, value_negate(false));
+
+    Expect.equals(true, value_and(true, true));
+    Expect.equals(false, value_and(true, false));
+    Expect.equals(false, value_and(false, true));
+    Expect.equals(false, value_and(false, false));
+
+    Expect.equals(false, value_and_not(true, true));
+    Expect.equals(true, value_and_not(true, false));
+    Expect.equals(false, value_and_not(false, true));
+    Expect.equals(false, value_and_not(false, false));
+
+    Expect.equals(false, value_not_and(true, true));
+    Expect.equals(false, value_not_and(true, false));
+    Expect.equals(true, value_not_and(false, true));
+    Expect.equals(false, value_not_and(false, false));
+
+    Expect.equals(false, value_not_and_not(true, true));
+    Expect.equals(false, value_not_and_not(true, false));
+    Expect.equals(false, value_not_and_not(false, true));
+    Expect.equals(true, value_not_and_not(false, false));
+
+    Expect.equals(true, value_or(true, true));
+    Expect.equals(true, value_or(true, false));
+    Expect.equals(true, value_or(false, true));
+    Expect.equals(false, value_or(false, false));
+
+    Expect.equals(true, value_or_not(true, true));
+    Expect.equals(true, value_or_not(true, false));
+    Expect.equals(false, value_or_not(false, true));
+    Expect.equals(true, value_or_not(false, false));
+
+    Expect.equals(true, value_not_or(true, true));
+    Expect.equals(false, value_not_or(true, false));
+    Expect.equals(true, value_not_or(false, true));
+    Expect.equals(true, value_not_or(false, false));
+
+    Expect.equals(false, value_not_or_not(true, true));
+    Expect.equals(true, value_not_or_not(true, false));
+    Expect.equals(true, value_not_or_not(false, true));
+    Expect.equals(true, value_not_or_not(false, false));
+
+
+    Expect.equals(0, if_negate(true));
+    Expect.equals(1, if_negate(false));
+
+    Expect.equals(1, if_and(true, true));
+    Expect.equals(0, if_and(true, false));
+    Expect.equals(0, if_and(false, true));
+    Expect.equals(0, if_and(false, false));
+
+    Expect.equals(0, if_and_not(true, true));
+    Expect.equals(1, if_and_not(true, false));
+    Expect.equals(0, if_and_not(false, true));
+    Expect.equals(0, if_and_not(false, false));
+
+    Expect.equals(0, if_not_and(true, true));
+    Expect.equals(0, if_not_and(true, false));
+    Expect.equals(1, if_not_and(false, true));
+    Expect.equals(0, if_not_and(false, false));
+
+    Expect.equals(0, if_not_and_not(true, true));
+    Expect.equals(0, if_not_and_not(true, false));
+    Expect.equals(0, if_not_and_not(false, true));
+    Expect.equals(1, if_not_and_not(false, false));
+
+    Expect.equals(1, if_or(true, true));
+    Expect.equals(1, if_or(true, false));
+    Expect.equals(1, if_or(false, true));
+    Expect.equals(0, if_or(false, false));
+
+    Expect.equals(1, if_or_not(true, true));
+    Expect.equals(1, if_or_not(true, false));
+    Expect.equals(0, if_or_not(false, true));
+    Expect.equals(1, if_or_not(false, false));
+
+    Expect.equals(1, if_not_or(true, true));
+    Expect.equals(0, if_not_or(true, false));
+    Expect.equals(1, if_not_or(false, true));
+    Expect.equals(1, if_not_or(false, false));
+
+    Expect.equals(0, if_not_or_not(true, true));
+    Expect.equals(1, if_not_or_not(true, false));
+    Expect.equals(1, if_not_or_not(false, true));
+    Expect.equals(1, if_not_or_not(false, false));
+}
diff --git a/tests/language/if_flatten1_test.dart b/tests/language/rewrite_nested_if1_test.dart
similarity index 100%
rename from tests/language/if_flatten1_test.dart
rename to tests/language/rewrite_nested_if1_test.dart
diff --git a/tests/language/if_flatten2_test.dart b/tests/language/rewrite_nested_if2_test.dart
similarity index 100%
rename from tests/language/if_flatten2_test.dart
rename to tests/language/rewrite_nested_if2_test.dart
diff --git a/tests/language/rewrite_nested_if3_test.dart b/tests/language/rewrite_nested_if3_test.dart
new file mode 100644
index 0000000..a9fd16f
--- /dev/null
+++ b/tests/language/rewrite_nested_if3_test.dart
@@ -0,0 +1,78 @@
+// 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';
+
+baz() {}
+
+check_true_true(x, y) {
+  if (x) {
+    if (y) {
+      return true;
+    }
+  }
+  baz();
+  return false;
+}
+
+check_false_true(x, y) {
+  if (x) {
+
+  } else {
+    if (y) {
+      return true;
+    }
+  }
+  baz();
+  return false;
+}
+
+check_true_false(x, y) {
+  if (x) {
+    if (y) {
+
+    } else {
+      return true;
+    }
+  }
+  baz();
+  return false;
+}
+
+check_false_false(x, y) {
+  if (x) {
+
+  } else {
+    if (y) {
+
+    } else {
+      return true;
+    }
+  }
+  baz();
+  return false;
+}
+
+
+main() {
+  Expect.equals(true, check_true_true(true, true));
+  Expect.equals(false, check_true_true(true, false));
+  Expect.equals(false, check_true_true(false, true));
+  Expect.equals(false, check_true_true(false, false));
+
+  Expect.equals(false, check_true_false(true, true));
+  Expect.equals(true, check_true_false(true, false));
+  Expect.equals(false, check_true_false(false, true));
+  Expect.equals(false, check_true_false(false, false));
+
+  Expect.equals(false, check_false_true(true, true));
+  Expect.equals(false, check_false_true(true, false));
+  Expect.equals(true, check_false_true(false, true));
+  Expect.equals(false, check_false_true(false, false));
+
+  Expect.equals(false, check_false_false(true, true));
+  Expect.equals(false, check_false_false(true, false));
+  Expect.equals(false, check_false_false(false, true));
+  Expect.equals(true, check_false_false(false, false));
+}
diff --git a/tests/language/rewrite_while_test.dart b/tests/language/rewrite_while_test.dart
index 5bb1105..44e72ed 100644
--- a/tests/language/rewrite_while_test.dart
+++ b/tests/language/rewrite_while_test.dart
@@ -4,6 +4,7 @@
 
 import "package:expect/expect.dart";
 
+
 baz() {}
 
 loop1(x) {
@@ -25,8 +26,30 @@
     return n;
 }
 
+f1(b) {
+  while (b)
+    return 1;
+
+  return 2;
+}
+
+f2(b) {
+  while (b) {
+    return 1;
+  }
+  return 2;
+}
+
 main() {
+    Expect.equals(0,  loop1(-10));
     Expect.equals(10, loop1(10));
+
+    Expect.equals(0,  loop2(-10));
     Expect.equals(10, loop2(10));
-    Expect.equals(0, loop2(200));
+    Expect.equals(0,  loop2(200));
+
+    Expect.equals(1, f1(true));
+    Expect.equals(2, f1(false));
+    Expect.equals(1, f2(true));
+    Expect.equals(2, f2(false));
 }
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 2174982..09c9c46 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -16,7 +16,6 @@
 mirrors/mirrors_reader_test: Skip # Issue 16589
 
 [ $csp ]
-mirrors/delegate_test: RuntimeError # Issue 13864
 async/deferred/deferred_in_isolate_test: RuntimeError # Issue 16898
 mirrors/deferred_mirrors_metadata_test: Fail # Issue 16898
 mirrors/deferred_mirrors_metatarget_test: Fail # Issue 16898
@@ -38,9 +37,6 @@
 mirrors/equality_test/02: RuntimeError # Issue 12785
 mirrors/fake_function_with_call_test: RuntimeError # Issue 11612
 mirrors/fake_function_without_call_test: RuntimeError # Issue 11612
-mirrors/find_in_context_test: Fail # Issue 6490
-mirrors/find_in_context_private_test: Fail # Issue 6490
-mirrors/find_in_context_fake_function_test: Fail # Issue 6490
 mirrors/function_type_mirror_test: RuntimeError # Issue 12166
 mirrors/generic_f_bounded_mixin_application_test: RuntimeError # Issue 12087
 mirrors/generic_function_typedef_test: RuntimeError # Issue 12333
@@ -283,11 +279,6 @@
 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
-
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
 # Issue 13921: spawnFunction is not allowed on Dartium's DOM thread.
 async/timer_isolate_test: Fail
diff --git a/tests/lib/mirrors/find_in_context_fake_function_test.dart b/tests/lib/mirrors/find_in_context_fake_function_test.dart
deleted file mode 100644
index 93aeeb8..0000000
--- a/tests/lib/mirrors/find_in_context_fake_function_test.dart
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--support_find_in_context=true
-
-// Regression test: this used to crash the VM.
-
-library test.find_in_context_fake_function;
-
-import "dart:mirrors";
-import "package:expect/expect.dart";
-
-var topLevelField = 1;
-get topLevelGetter => 2;
-topLevelFunction() => 3;
-
-class FakeFunction1 {
-  var field = 4;
-  get getter => 5;
-  method() => 6;
-  static var staticField = 7;
-  static get staticGetter => 8;
-  staticFunction() => 9;
-  call(x) {
-    var local = x * 2;
-    return local;
-  }
-}
-
-class FakeFunction2 implements Function {
-  var field = 10;
-  get getter => 11;
-  method() => 12;
-  static var staticField = 13;
-  static get staticGetter => 14;
-  staticFunction() => 15;
-  noSuchMethod(msg) {
-    var local = msg.positionalArguments;
-    if (msg.memberName != #call) return super.noSuchMethod(msg);
-    return local.join('+');
-  }
-}
-
-doFindInContext(cm, name, value) {
-  Expect.equals(value,
-                cm.findInContext(name).reflectee);
-}
-dontFindInContext(cm, name) {
-  Expect.isNull(cm.findInContext(name));
-}
-
-main() {
-  ClosureMirror cm = reflect(new FakeFunction1());
-  dontFindInContext(cm, #local);
-  dontFindInContext(cm, const Symbol('this'));
-  dontFindInContext(cm, #field);
-  dontFindInContext(cm, #getter);
-  dontFindInContext(cm, #method);
-  dontFindInContext(cm, #staticField);
-  dontFindInContext(cm, #staticGetter);
-  dontFindInContext(cm, #staticFunction);
-  dontFindInContext(cm, #topLevelField);
-  dontFindInContext(cm, #topLevelGetter);
-  dontFindInContext(cm, #topLevelFunction);
-
-  cm = reflect(new FakeFunction2());
-  dontFindInContext(cm, #local);
-  dontFindInContext(cm, const Symbol('this'));
-  dontFindInContext(cm, #field);
-  dontFindInContext(cm, #getter);
-  dontFindInContext(cm, #method);
-  dontFindInContext(cm, #staticField);
-  dontFindInContext(cm, #staticGetter);
-  dontFindInContext(cm, #staticFunction);
-  dontFindInContext(cm, #topLevelField);
-  dontFindInContext(cm, #topLevelGetter);
-  dontFindInContext(cm, #topLevelFunction);
-}
diff --git a/tests/lib/mirrors/find_in_context_private_test.dart b/tests/lib/mirrors/find_in_context_private_test.dart
deleted file mode 100644
index dc35893..0000000
--- a/tests/lib/mirrors/find_in_context_private_test.dart
+++ /dev/null
@@ -1,104 +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.
-
-// VMOptions=--support_find_in_context=true
-
-library test.find_in_context_private;
-
-import "dart:mirrors";
-import "package:expect/expect.dart";
-
-var _globalVariable = "globalVariable";
-_globalFoo() => 17;
-
-class S {
-  static _staticFooInS() => "staticFooInS";
-  static var _staticInS = "staticInS";
-  var _instanceInS = "instanceInS";
-}
-
-class C extends S {
-  static _staticFooInC() => "staticFooInC";
-  static var _staticInC = "staticInC";
-  var _instanceInC = "instanceInC";
-
-  _method() {
-    var _local = "local";
-    nested() {
-      var _innerLocal = "innerLocal";
-      print(this._instanceInC);
-      print(_local);
-      print(_innerLocal);
-    }
-    return nested;
-  }
-
-}
-
-doFindInContext(cm, name, value) {
-  Expect.equals(value,
-                cm.findInContext(name).reflectee);
-}
-dontFindInContext(cm, name) {
-  Expect.isNull(cm.findInContext(name));
-}
-
-main() {
-  LibraryMirror wrongLibrary = reflectClass(List).owner;
-  p(name) => MirrorSystem.getSymbol(name, wrongLibrary);
-
-  C c = new C();
-
-  // In the context of C._method.nested.
-  ClosureMirror cm = reflect(c._method());
-
-  // N.B.: innerLocal is only defined with respective to an activation of the
-  // closure 'nested', not the closure itself.
-  dontFindInContext(cm, #_innerLocal);
-
-  doFindInContext(cm, #_local, "local");
-  doFindInContext(cm, #_method, c._method);
-  doFindInContext(cm, #_instanceInC, "instanceInC");
-  doFindInContext(cm, #_staticInC, "staticInC");
-  doFindInContext(cm, #_staticFooInC, C._staticFooInC);
-  dontFindInContext(cm, #_staticInS);
-  dontFindInContext(cm, #_staticFooInS);
-  doFindInContext(cm, #_globalFoo, _globalFoo);
-  doFindInContext(cm, #_globalVariable, "globalVariable");
-
-  dontFindInContext(cm, p('_local'));
-  dontFindInContext(cm, p('_innerLocal'));
-  dontFindInContext(cm, p('_method'));
-  dontFindInContext(cm, p('_instanceInC'));
-  dontFindInContext(cm, p('_staticInC'));
-  dontFindInContext(cm, p('_staticFooInC'));
-  dontFindInContext(cm, p('_staticInS'));
-  dontFindInContext(cm, p('_staticFooInS'));
-  dontFindInContext(cm, p('_globalFoo'));
-  dontFindInContext(cm, p('_globalVariable'));
-
-  // In the context of C._method.
-  cm = reflect(c._method);
-  dontFindInContext(cm, #_innerLocal);
-  dontFindInContext(cm, #_local);  // N.B.: See above.
-  doFindInContext(cm, #_method, c._method);
-  doFindInContext(cm, #_instanceInC, "instanceInC");
-  doFindInContext(cm, #_staticInC, "staticInC");
-  doFindInContext(cm, #_staticFooInC, C._staticFooInC);
-  dontFindInContext(cm, #_staticInS);
-  dontFindInContext(cm, #_staticFooInS);
-  doFindInContext(cm, #_globalFoo, _globalFoo);
-  doFindInContext(cm, #_globalVariable, "globalVariable");
-
-  dontFindInContext(cm, p('_local'));
-  dontFindInContext(cm, p('_innerLocal'));
-  dontFindInContext(cm, p('_method'));
-  dontFindInContext(cm, p('_instanceInC'));
-  dontFindInContext(cm, p('_staticInC'));
-  dontFindInContext(cm, p('_staticFooInC'));
-  dontFindInContext(cm, p('_staticInS'));
-  dontFindInContext(cm, p('_staticFooInS'));
-  dontFindInContext(cm, p('_globalFoo'));
-  dontFindInContext(cm, p('_globalVariable'));
-}
diff --git a/tests/lib/mirrors/find_in_context_test.dart b/tests/lib/mirrors/find_in_context_test.dart
deleted file mode 100644
index 348cd3a..0000000
--- a/tests/lib/mirrors/find_in_context_test.dart
+++ /dev/null
@@ -1,157 +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.
-
-// VMOptions=--support_find_in_context=true
-
-import "dart:mirrors";
-
-import "stringify.dart";
-
-import "package:expect/expect.dart";
-
-import "closure_mirror_import1.dart";
-import "closure_mirror_import1.dart" as imp1;
-import "closure_mirror_import1.dart" as imp1_hidden
-    hide globalVariableInImport, StaticClass;
-import "closure_mirror_import2.dart" as imp2;
-
-var globalVariable = "globalVariable";
-
-globalFoo() => 17;
-
-class S { 
-  static staticFooInS() => "staticFooInS";
-  static var staticInS = "staticInS";
-  var instanceInS = "instanceInS";
-}
-
-class C extends S { 
-  static staticFooInC() => "staticFooInC";
-  static var staticInC = "staticInC";
-  var instanceInC = "instanceInC";
-
-  foo() => null;
-
-  bar() {
-    var x = 7;
-    var instanceInC = 11;  // Shadowing the instance field.
-    var y = 3;  // Not in context.
-    baz() {
-      if (x) {}
-      if (instanceInC) {}
-    };
-    return reflect(baz);
-  }
-
-  baz() {
-    var instanceInC = null; // Shadowing with a null value.
-    return reflect(() => instanceInC);
-  }
-}
-
-main() {
-  C c = new C();
-  ClosureMirror cm = reflect(c.foo);
-
-  var result;
-
-  result = cm.findInContext(#globalVariable);
-  expect("Instance(value = globalVariable)", result);
-
-  result = cm.findInContext(#globalFoo);
-  Expect.isTrue(result is ClosureMirror);
-  expect("Instance(value = 17)", result.apply(const []));
-
-  result = cm.findInContext(#S.staticInS);
-  expect("Instance(value = staticInS)", result);
-
-  result = cm.findInContext(#staticInS);
-  Expect.isFalse(result is InstanceMirror);
-  Expect.equals(null, result);
-
-  result = cm.findInContext(#staticFooInS);
-  Expect.isFalse(result is InstanceMirror);
-  Expect.equals(null, result);
-
-  result = cm.findInContext(#S.staticFooInS);
-  Expect.isTrue(result is ClosureMirror);
-  expect("Instance(value = staticFooInS)", result.apply(const []));
-
-  result = cm.findInContext(#C.staticFooInS);
-  Expect.isFalse(result is InstanceMirror);
-  Expect.equals(null, result);
-
-  result = cm.findInContext(#C.staticInC);
-  expect("Instance(value = staticInC)", result);
-
-  result = cm.findInContext(#staticInC);
-  expect("Instance(value = staticInC)", result);
-
-  result = cm.findInContext(#C.staticFooInC);
-  Expect.isTrue(result is ClosureMirror);
-  expect("Instance(value = staticFooInC)", result.apply(const []));
-
-  result = cm.findInContext(#staticFooInC);
-  Expect.isTrue(result is ClosureMirror);
-  expect("Instance(value = staticFooInC)", result.apply(const []));
-
-  result = cm.findInContext(#instanceInC);
-  expect("Instance(value = instanceInC)", result);
-
-  result = cm.findInContext(#instanceInS);
-  expect("Instance(value = instanceInS)", result);
-
-  result = cm.findInContext(#globalVariableInImport1);
-  expect("Instance(value = globalVariableInImport1)", result);
-
-  result = cm.findInContext(#StaticClass.staticField);
-  expect("Instance(value = staticField)", result);
-
-  result = cm.findInContext(#StaticClass.staticFunctionInStaticClass);
-  Expect.isTrue(result is ClosureMirror);
-  expect("Instance(value = staticFunctionInStaticClass)",
-         result.apply(const []));
-
-  result = cm.findInContext(#imp1.StaticClass.staticFunctionInStaticClass);
-  Expect.isTrue(result is ClosureMirror);
-  expect("Instance(value = staticFunctionInStaticClass)",
-         result.apply(const []));
-
-  result = cm.findInContext(#imp1.globalVariableInImport1);
-  expect("Instance(value = globalVariableInImport1)", result);
-
-  result = cm.findInContext(#imp2.globalVariableInImport);
-  Expect.isFalse(result is InstanceMirror);
-  Expect.equals(null, result);
-
-  result = cm.findInContext(#imp1.StaticClass.staticField);
-  expect("Instance(value = staticField)", result);
-
-  result = cm.findInContext(#imp1_hidden.StaticClass.staticField);
-  Expect.isFalse(result is InstanceMirror);
-  Expect.equals(null, result);
-
-  result = cm.findInContext(#firstGlobalVariableInImport2);
-  expect("Instance(value = firstGlobalVariableInImport2)", result);
-
-  result = cm.findInContext(#secondGlobalVariableInImport2);
-  Expect.isFalse(result is InstanceMirror);
-  Expect.equals(null, result);
-
-  result = cm.findInContext(#imp2.secondGlobalVariableInImport2);
-  expect("Instance(value = secondGlobalVariableInImport2)", result);
-
-  result = c.bar().findInContext(#x);
-  expect("Instance(value = 7)", result);
-
-  result = c.bar().findInContext(#instanceInC);
-  expect("Instance(value = 11)", result);
-
-  result = c.bar().findInContext(#y);
-  Expect.isFalse(result is InstanceMirror);
-  Expect.equals(null, result);
-
-  result = c.baz().findInContext(#instanceInC);
-  expect("Instance(value = <null>)", result);
-}
diff --git a/tools/VERSION b/tools/VERSION
index f15d3d2..aa05518 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 5
 PATCH 0
-PRERELEASE 2
+PRERELEASE 3
 PRERELEASE_PATCH 0
diff --git a/tools/bots/bot.py b/tools/bots/bot.py
index a9b7e70..9590a49 100644
--- a/tools/bots/bot.py
+++ b/tools/bots/bot.py
@@ -45,7 +45,8 @@
   def __init__(self, compiler, runtime, mode, system, checked=False,
                host_checked=False, minified=False, shard_index=None,
                total_shards=None, is_buildbot=False, test_set=None,
-               csp=None, arch=None, dart2js_full=False, builder_tag=None):
+               csp=None, arch=None, dart2js_full=False, builder_tag=None,
+               batch=False):
     self.compiler = compiler
     self.runtime = runtime
     self.mode = mode
@@ -60,6 +61,7 @@
     self.csp = csp
     self.dart2js_full = dart2js_full
     self.builder_tag = builder_tag
+    self.batch = batch
     if (arch == None):
       self.arch = 'ia32'
     else:
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 3f0876c..5ea8d34 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -22,7 +22,7 @@
 
 DARTIUM_BUILDER = r'none-dartium-(linux|mac|windows)'
 DART2JS_BUILDER = (
-    r'dart2js-(linux|mac|windows)(-(jsshell))?-(debug|release)(-(checked|host-checked))?(-(host-checked))?(-(minified))?(-(x64))?-?(\d*)-?(\d*)')
+    r'dart2js-(linux|mac|windows)(-(jsshell))?-(debug|release)(-(checked|host-checked))?(-(host-checked))?(-(minified))?(-(x64))?(-(batch))?-?(\d*)-?(\d*)')
 DART2JS_FULL_BUILDER = r'dart2js-full-(linux|mac|windows)(-checked)?(-minified)?-(\d+)-(\d+)'
 WEB_BUILDER = (
     r'dart2js-(ie9|ie10|ie11|ff|safari|chrome|chromeOnAndroid|safarimobilesim|opera|drt)-(win7|win8|mac10\.8|mac10\.7|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
@@ -56,6 +56,7 @@
   csp = None
   arch = None
   dart2js_full = False
+  batch = False
 
   dart2js_pattern = re.match(DART2JS_BUILDER, builder_name)
   dart2js_full_pattern = re.match(DART2JS_FULL_BUILDER, builder_name)
@@ -106,8 +107,10 @@
       minified = True
     if dart2js_pattern.group(12) == 'x64':
       arch = 'x64'
-    shard_index = dart2js_pattern.group(13)
-    total_shards = dart2js_pattern.group(14)
+    if dart2js_pattern.group(14) == 'batch':
+      batch = True
+    shard_index = dart2js_pattern.group(15)
+    total_shards = dart2js_pattern.group(16)
   elif dartium_pattern:
     compiler = 'none'
     runtime = 'dartium'
@@ -132,7 +135,7 @@
     return None
   return bot.BuildInfo(compiler, runtime, mode, system, checked, host_checked,
                        minified, shard_index, total_shards, is_buildbot,
-                       test_set, csp, arch, dart2js_full)
+                       test_set, csp, arch, dart2js_full, batch=batch)
 
 
 def NeedsXterm(compiler, runtime):
@@ -329,6 +332,7 @@
   if build_info.checked: test_flags += ['--checked']
   if build_info.minified: test_flags += ['--minified']
   if build_info.host_checked: test_flags += ['--host-checked']
+  if build_info.batch: test_flags += ['--dart2js-batch']
 
   if build_info.dart2js_full:
     compiler = build_info.compiler
diff --git a/tools/bots/dartium_android.py b/tools/bots/dartium_android.py
index 980fb8f..e10afd5 100644
--- a/tools/bots/dartium_android.py
+++ b/tools/bots/dartium_android.py
@@ -14,6 +14,7 @@
 import optparse
 import os
 import string
+import subprocess
 import sys
 
 import bot
@@ -55,6 +56,13 @@
     UploadSetACL(gsutil, local, remote)
     print "Uploaded content shell, available from: %s" % content_shell_link
 
+
+def RunContentShellTests(options):
+  with bot.BuildStep('ContentShell tests'):
+    subprocess.check_call([os.path.join(SCRIPT_DIR, 'run_android_tests.sh'),
+        os.path.join(options.build_products_dir, CS_LOCATION)])
+
+
 def main():
   if sys.platform != 'linux2':
     print "This script was only tested on linux. Please run it on linux!"
@@ -68,6 +76,7 @@
     sys.exit(1)
 
   UploadAPKs(options)
+  RunContentShellTests(options)
   sys.exit(0)
 
 if __name__ == '__main__':
diff --git a/tools/bots/run_android_tests.sh b/tools/bots/run_android_tests.sh
new file mode 100755
index 0000000..c728f3a
--- /dev/null
+++ b/tools/bots/run_android_tests.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+# 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 script is meant to be run inside the src directory of a Dartium
+# (or Chromium) checkout, with android_tools installed in third_party.
+# It expects ContentShell to have been build for ARM android, using the
+# ninja build system.
+# It expects a single android device to be connected by USB to the machine.
+set -v
+set -x
+cd src
+ninja -C out/Release forwarder2
+ninja -C out/Release pkg_packages
+cp -R out/Release/packages out/ReleaseARM/packages
+export PATH=$PATH:third_party/android_tools/sdk/platform-tools/\
+:third_party/android_tools/sdk/tools/
+
+adb uninstall org.chromium.content_shell_apk
+adb install -r $1
+./build/android/adb_reverse_forwarder.py 8081 8081 8082 8082 \
+                                         8083 8083 8084 8084 &
+FORWARDER_PID = $!
+sleep 15
+./dart/tools/test.py -m release -a arm --progress=line --report --time \
+    --failure-summary --write-debug-log --local_ip=localhost \
+    --test_server_port=8083 --test_server_cross_origin_port=8084 \
+    --test_driver_port=8081 --test_driver_error_port=8082 \
+    -r ContentShellOnAndroid
+EXIT_CODE=$?
+kill -9 $FORWARDER_PID
+exit $EXIT_CODE
diff --git a/tools/build.py b/tools/build.py
index 5f219d2..e0205ba 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -45,7 +45,7 @@
       default=False, action="store_true")
   result.add_option("-a", "--arch",
       help='Target architectures (comma-separated).',
-      metavar='[all,ia32,x64,simarm,arm,simmips,mips,simarm64]',
+      metavar='[all,ia32,x64,simarm,arm,simmips,mips,simarm64,arm64,]',
       default=utils.GuessArchitecture())
   result.add_option("--os",
     help='Target OSs (comma-separated).',
@@ -90,7 +90,8 @@
       print "Unknown mode %s" % mode
       return False
   for arch in options.arch:
-    archs = ['ia32', 'x64', 'simarm', 'arm', 'simmips', 'mips', 'simarm64']
+    archs = ['ia32', 'x64', 'simarm', 'arm', 'simmips', 'mips',
+             'simarm64', 'arm64',]
     if not arch in archs:
       print "Unknown arch %s" % arch
       return False
diff --git a/tools/dartium/download_multivm.py b/tools/dartium/download_multivm.py
index a95f9f2..0a31bce 100755
--- a/tools/dartium/download_multivm.py
+++ b/tools/dartium/download_multivm.py
@@ -15,6 +15,7 @@
 import shutil
 import subprocess
 import sys
+import tempfile
 
 # We are in [checkout dir]/src/dart/tools/dartium in a dartium/multivm checkout
 TOOLS_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -27,6 +28,18 @@
 if not os.path.exists(GSUTIL):
   GSUTIL = 'gsutil'
 
+class TempDir(object):
+  def __init__(self, prefix=''):
+    self._temp_dir = None
+    self._prefix = prefix
+
+  def __enter__(self):
+    self._temp_dir = tempfile.mkdtemp(self._prefix)
+    return self._temp_dir
+
+  def __exit__(self, *_):
+    shutil.rmtree(self._temp_dir, ignore_errors=True)
+
 def ExecuteCommand(cmd):
   print 'Executing: ' + ' '.join(cmd)
   subprocess.check_output(cmd)
@@ -38,8 +51,7 @@
                    .replace('linux', 'lucid64')
                    .replace('multivm', 'multivm-dartium')
                    .replace('perf', 'build'))
-  utils = imp.load_source('utils', os.path.join(TOOLS_DIR, 'utils.py'))
-  with utils.TempDir() as temp_dir:
+  with TempDir() as temp_dir:
     archive_file = archive_dir + '-' + revision + '.zip'
     gs_source = '/'.join([GS_BUCKET, archive_dir, archive_file])
     zip_file = os.path.join(temp_dir, archive_file)
diff --git a/tools/dartium/multivm_archive.py b/tools/dartium/multivm_archive.py
index 601adc3..499532c 100755
--- a/tools/dartium/multivm_archive.py
+++ b/tools/dartium/multivm_archive.py
@@ -22,15 +22,19 @@
 SRC_PATH = dartium_bot_utils.srcPath()
 
 def main():
-  multivm_deps = os.path.join(os.path.dirname(SRC_PATH), 'multivm.deps')
-  revision_directory = (multivm_deps if (os.path.isdir(multivm_deps))
-                           else os.path.join(SRC_PATH, 'dart'))
-  output, _ = subprocess.Popen(['svn', 'info'],
-                               stdout=subprocess.PIPE,
-                               stderr=subprocess.STDOUT,
-                               shell=(platform.system() == 'Windows'),
-                               cwd=revision_directory).communicate()
-  revision = re.search('Last Changed Rev: (\d+)', output).group(1)
+  if (upload_steps.BuildInfo('', '').channel == 'be'):
+    revision = sys.argv[1]
+  else:
+    multivm_deps = os.path.join(os.path.dirname(SRC_PATH), 'multivm.deps')
+    revision_directory = (multivm_deps if (os.path.isdir(multivm_deps))
+                                       else os.path.join(SRC_PATH, 'dart'))
+    output, _ = subprocess.Popen(['svn', 'info'],
+                                 stdout=subprocess.PIPE,
+                                 stderr=subprocess.STDOUT,
+                                 shell=(platform.system() == 'Windows'),
+                                 cwd=revision_directory).communicate()
+    revision = re.search('Last Changed Rev: (\d+)', output).group(1)
+
   version = revision + '.0'
   info = upload_steps.BuildInfo(version, revision)
   if info.is_build:
diff --git a/tools/dartium/update_deps.py b/tools/dartium/update_deps.py
index 381d393..ed91c16 100755
--- a/tools/dartium/update_deps.py
+++ b/tools/dartium/update_deps.py
@@ -41,7 +41,7 @@
 ########################################################################
 
 BRANCH_CURRENT="dart/1916"
-BRANCH_NEXT="dart/1916"
+BRANCH_NEXT="dart/1985"
 BRANCH_MULTIVM="dart/multivm"
 
 TARGETS = {
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index 6ef26f6..d4353b3 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -95,6 +95,9 @@
   [Suppressed] void assert(boolean condition);
 
   [Suppressed] attribute boolean webkitImageSmoothingEnabled;
+
+  // Removed in 1985.
+  [Suppressed] readonly attribute float webkitBackingStorePixelRatio; 
 };
 
 [Supplemental]
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index c149025..b42afe2 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -237,6 +237,21 @@
   'Element.hasAttributeNS',
   'Element.innerHTML',
   'Element.querySelectorAll',
+  # TODO(vsm): These have been converted from int to double in Chrome 36.
+  # Special case them so we run on 34, 35, and 36.
+  'Element.offsetLeft',
+  'Element.offsetTop',
+  'Element.offsetWidth',
+  'Element.offsetHeight',
+  'Element.clientLeft',
+  'Element.clientTop',
+  'Element.clientWidth',
+  'Element.clientHeight',
+  'Element.scrollLeft',
+  'Element.scrollTop',
+  'Element.scrollWidth',
+  'Element.scrollHeight',
+
   'Event.initEvent',
   'Geolocation.clearWatch',
   'Geolocation.getCurrentPosition',
@@ -303,6 +318,7 @@
   'Screen.availLeft',
   'Screen.availTop',
   'Screen.availWidth',
+  'ShadowRoot.applyAuthorStyles',
   'ShadowRoot.resetStyleInheritance',
   'Storage.clear',
   'Storage.getItem',
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index 512ff7d..aef8e8b 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -152,5 +152,8 @@
   'JsFunction': js.JsFunction,
   'JsArray': js.JsArray,
 $!TYPE_MAP
+  // FIXME: Temporary workaround.  The Blink name matches the Dart name
+  // post Chrome 35.  We still generate the old mapping from 'Clipboard'.
+  'DataTransfer': DataTransfer,
 };
 $endif
diff --git a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
index ee4df4f..a5964c0 100644
--- a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
@@ -348,5 +348,11 @@
     JS('void', '#.fill(#)', this, winding);
   }
 $endif
+
+  /** Deprecated always returns 1.0 */
+  @DomName('CanvasRenderingContext2D.webkitBackingStorePixelRation')
+  @Experimental()
+  @deprecated
+  double get backingStorePixelRatio => 1.0;
 }
 
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index c28b153..5069291 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -1325,6 +1325,113 @@
    */
   ElementEvents get on => new ElementEvents(this);
 
+$if DART2JS
+  @DomName('Element.offsetHeight')
+  @DocsEditable()
+  final num offsetHeight;
+
+  @DomName('Element.offsetLeft')
+  @DocsEditable()
+  final num offsetLeft;
+
+  @DomName('Element.offsetTop')
+  @DocsEditable()
+  final num offsetTop;
+
+  @DomName('Element.offsetWidth')
+  @DocsEditable()
+  final num offsetWidth;
+
+  @DomName('Element.clientHeight')
+  @DocsEditable()
+  final num clientHeight;
+
+  @DomName('Element.clientLeft')
+  @DocsEditable()
+  final num clientLeft;
+
+  @DomName('Element.clientTop')
+  @DocsEditable()
+  final num clientTop;
+
+  @DomName('Element.clientWidth')
+  @DocsEditable()
+  final num clientWidth;
+
+  @DomName('Element.scrollHeight')
+  @DocsEditable()
+  final num scrollHeight;
+
+  @DomName('Element.scrollLeft')
+  @DocsEditable()
+  num scrollLeft;
+
+  @DomName('Element.scrollTop')
+  @DocsEditable()
+  num scrollTop;
+
+  @DomName('Element.scrollWidth')
+  @DocsEditable()
+  final num scrollWidth;
+
+$else
+  @DomName('Element.offsetHeight')
+  @DocsEditable()
+  num get offsetHeight => _blink.Native_Element_offsetHeight_Getter(this);
+
+  @DomName('Element.offsetLeft')
+  @DocsEditable()
+  num get offsetLeft => _blink.Native_Element_offsetLeft_Getter(this);
+
+  @DomName('Element.offsetTop')
+  @DocsEditable()
+  num get offsetTop => _blink.Native_Element_offsetTop_Getter(this);
+
+  @DomName('Element.offsetWidth')
+  @DocsEditable()
+  num get offsetWidth => _blink.Native_Element_offsetWidth_Getter(this);
+
+  @DomName('Element.clientHeight')
+  @DocsEditable()
+  num get clientHeight => _blink.Native_Element_clientHeight_Getter(this);
+
+  @DomName('Element.clientLeft')
+  @DocsEditable()
+  num get clientLeft => _blink.Native_Element_clientLeft_Getter(this);
+
+  @DomName('Element.clientTop')
+  @DocsEditable()
+  num get clientTop => _blink.Native_Element_clientTop_Getter(this);
+
+  @DomName('Element.clientWidth')
+  @DocsEditable()
+  num get clientWidth => _blink.Native_Element_clientWidth_Getter(this);
+
+  @DomName('Element.scrollHeight')
+  @DocsEditable()
+  num get scrollHeight => _blink.Native_Element_scrollHeight_Getter(this);
+
+  @DomName('Element.scrollLeft')
+  @DocsEditable()
+  num get scrollLeft => _blink.Native_Element_scrollLeft_Getter(this);
+
+  @DomName('Element.scrollLeft')
+  @DocsEditable()
+  void set scrollLeft(num value) => _blink.Native_Element_scrollLeft_Setter(this, value);
+
+  @DomName('Element.scrollTop')
+  @DocsEditable()
+  num get scrollTop => _blink.Native_Element_scrollTop_Getter(this);
+
+  @DomName('Element.scrollTop')
+  @DocsEditable()
+  void set scrollTop(num value) => _blink.Native_Element_scrollTop_Setter(this, value);
+
+  @DomName('Element.scrollWidth')
+  @DocsEditable()
+  num get scrollWidth => _blink.Native_Element_scrollWidth_Getter(this);
+$endif
+
 $!MEMBERS
 }
 
diff --git a/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate b/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
index 7cdf52b..2d518ba 100644
--- a/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
+++ b/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
@@ -16,27 +16,39 @@
 $endif
 
 $if DART_USE_BLINK
-  static bool _resetStyleInheritanceDeprecationReported = false;
-  static void _resetStyleInheritanceDeprecationReport() {
-    if (!_resetStyleInheritanceDeprecationReported) {
+  static bool _shadowRootDeprecationReported = false;
+  static void _shadowRootDeprecationReport() {
+    if (!_shadowRootDeprecationReported) {
       window.console.warn('''
-ShadowRoot.resetStyleInheritance is now deprecated in dart:html.
-Please remove from your code.
+ShadowRoot.resetStyleInheritance and ShadowRoot.applyAuthorStyles now deprecated in dart:html.
+Please remove them from your code.
 ''');
-      _resetStyleInheritanceDeprecationReported = true;
+      _shadowRootDeprecationReported = true;
     }
   }
 
   @deprecated
   bool get resetStyleInheritance {
-    _resetStyleInheritanceDeprecationReport();
+    _shadowRootDeprecationReport();
     // Default value from when it was specified.
     return false;
   }
 
   @deprecated
   void set resetStyleInheritance(bool value) {
-    _resetStyleInheritanceDeprecationReport();
+    _shadowRootDeprecationReport();
+  }
+
+  @deprecated
+  bool get applyAuthorStyles {
+    _shadowRootDeprecationReport();
+    // Default value from when it was specified.
+    return false;
+  }
+
+  @deprecated
+  void set applyAuthorStyles(bool value) {
+    _shadowRootDeprecationReport();
   }
 $else
   @deprecated
@@ -46,5 +58,13 @@
   void set resetStyleInheritance(bool value) {
     this._resetStyleInheritance = value;
   }
+
+  @deprecated
+  bool get applyAuthorStyles => this._applyAuthorStyles;
+
+  @deprecated
+  void set applyAuthorStyles(bool value) {
+    this._applyAuthorStyles = value;
+  }
 $endif
 }
diff --git a/tools/gyp/configurations.gypi b/tools/gyp/configurations.gypi
index aa3de2c..ddbe770 100644
--- a/tools/gyp/configurations.gypi
+++ b/tools/gyp/configurations.gypi
@@ -17,6 +17,7 @@
       ['"<(target_arch)"=="ia32"', { 'dart_target_arch': 'IA32', }],
       ['"<(target_arch)"=="x64"', { 'dart_target_arch': 'X64', }],
       ['"<(target_arch)"=="arm"', { 'dart_target_arch': 'ARM', }],
+      ['"<(target_arch)"=="arm64"', { 'dart_target_arch': 'ARM64', }],
       ['"<(target_arch)"=="simarm"', { 'dart_target_arch': 'SIMARM', }],
       ['"<(target_arch)"=="simarm64"', { 'dart_target_arch': 'SIMARM64', }],
       ['"<(target_arch)"=="mips"', { 'dart_target_arch': 'MIPS', }],
@@ -60,6 +61,13 @@
         ]
       },
 
+      'Dart_arm_Base': {
+        'abstract': 1,
+        'defines': [
+          'TARGET_ARCH_ARM',
+        ],
+      },
+
       'Dart_simarm64_Base': {
         'abstract': 1,
         'defines': [
@@ -67,10 +75,10 @@
         ]
       },
 
-      'Dart_arm_Base': {
+      'Dart_arm64_Base': {
         'abstract': 1,
         'defines': [
-          'TARGET_ARCH_ARM',
+          'TARGET_ARCH_ARM64',
         ],
       },
 
@@ -238,6 +246,42 @@
         ],
       },
 
+      'DebugXARM64': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_arm64_Base', 'Dart_Debug',
+          'Dart_Linux_Base',
+          'Dart_Linux_xarm64_Base',
+          'Dart_Linux_Debug',
+        ],
+      },
+
+      'ReleaseXARM64': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_arm64_Base', 'Dart_Release',
+          'Dart_Linux_Base',
+          'Dart_Linux_xarm64_Base',
+          'Dart_Linux_Release',
+        ],
+      },
+
+      'DebugARM64': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_arm64_Base', 'Dart_Debug',
+          'Dart_Linux_Base',
+          'Dart_Linux_arm64_Base',
+          'Dart_Linux_Debug',
+        ],
+      },
+
+      'ReleaseARM64': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_arm64_Base', 'Dart_Release',
+          'Dart_Linux_Base',
+          'Dart_Linux_arm64_Base',
+          'Dart_Linux_Release',
+        ],
+      },
+
       'DebugXMIPS': {
         'inherit_from': [
           'Dart_Base', 'Dart_mips_Base', 'Dart_Debug',
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index bf2c3bb..6ff4c5b 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -81,6 +81,25 @@
         ],
       },
 
+      # ARM64 cross-build
+      'Dart_Linux_xarm64_Base': {
+        'abstract': 1,
+        'target_conditions': [
+        ['_toolset=="target"', {
+          'cflags': [ '-O3', ],
+        }],
+        ['_toolset=="host"', {
+          'cflags': ['-O3', '-m64', '-msse2'],
+          'ldflags': ['-m64'],
+        }]]
+      },
+
+      # ARM64 native build
+      'Dart_Linux_arm64_Base': {
+        'abstract': 1,
+        'cflags': [ '-O3', ],
+      },
+
       'Dart_Linux_simmips_Base': {
         'abstract': 1,
         'cflags': [ '-O3', '-m32', '-msse2' ],
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index 42fed87..f686e24 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -6,6 +6,10 @@
 
 import 'dart:async';
 import 'dart:io';
+
+import 'dart:convert' show
+    HtmlEscape;
+
 import 'test_suite.dart';  // For TestUtils.
 // TODO(efortuna): Rewrite to not use the args library and simply take an
 // expected number of arguments, so test.dart doesn't rely on the args library?
@@ -379,6 +383,26 @@
                           '"${request.uri.path}"');
     }
     response.statusCode = HttpStatus.NOT_FOUND;
+
+    // Send a nice HTML page detailing the error message.  Most browsers expect
+    // this, for example, Chrome will simply display a blank page if you don't
+    // provide any information.  A nice side effect of this is to work around
+    // Firefox bug 1016313
+    // (https://bugzilla.mozilla.org/show_bug.cgi?id=1016313).
+    response.headers.set(HttpHeaders.CONTENT_TYPE, 'text/html');
+    String escapedPath = const HtmlEscape().convert(request.uri.path);
+    response.write("""
+<!DOCTYPE html>
+<html lang='en'>
+<head>
+<title>Not Found</title>
+</head>
+<body>
+<h1>Not Found</h1>
+<p style='white-space:pre'>The file '$escapedPath\' could not be found.</p>
+</body>
+</html>
+""");
     response.close();
     response.done.catchError((e) {
       DebugLogger.warning(
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index 48824f3..b880a72 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -300,12 +300,19 @@
               ''),
           new _TestOptionSpecification(
               'noBatch',
-              'Do not run browser tests in batch mode',
+              'Do not run tests in batch mode',
               ['-n', '--nobatch'],
               [],
               false,
               type: 'bool'),
           new _TestOptionSpecification(
+              'dart2js_batch',
+              'Run dart2js tests in batch mode',
+              ['--dart2js-batch'],
+              [],
+              false,
+              type: 'bool'),
+          new _TestOptionSpecification(
               'append_logs',
               'Do not delete old logs but rather append to them.',
               ['--append_logs'],
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 300fbee..8eea247 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -1941,25 +1941,8 @@
 }
 
 class BatchRunnerProcess {
-  static bool isWindows = io.Platform.operatingSystem == 'windows';
-
-  final batchRunnerTypes = {
-      'dartanalyzer' : {
-        'run_executable' :
-           isWindows ?
-             'sdk\\bin\\dartanalyzer_developer.bat'
-              : 'sdk/bin/dartanalyzer_developer',
-        'run_arguments' : ['--batch'],
-      },
-      'dart2analyzer' : {
-        // This is a unix shell script, no windows equivalent available
-        'run_executable' : 'editor/tools/analyzer',
-        'run_arguments' : ['--batch'],
-    },
-  };
-
   Completer<CommandOutput> _completer;
-  Command _command;
+  ProcessCommand _command;
   List<String> _arguments;
   String _runnerType;
 
@@ -1992,7 +1975,6 @@
     _currentlyRunning = true;
     _command = command;
     _arguments = arguments;
-
     _processEnvironmentOverrides = command.environmentOverrides;
 
     if (_process == null) {
@@ -2091,8 +2073,9 @@
   }
 
   _startProcess(callback) {
-    var executable = batchRunnerTypes[_runnerType]['run_executable'];
-    var arguments = batchRunnerTypes[_runnerType]['run_arguments'];
+    assert(_command is ProcessCommand);
+    var executable = _command.executable;
+    var arguments = ['--batch'];
     var environment = new Map.from(io.Platform.environment);
     if (_processEnvironmentOverrides != null) {
       for (var key in _processEnvironmentOverrides.keys) {
@@ -2527,9 +2510,13 @@
 
   Future<CommandOutput> _runCommand(Command command, int timeout) {
     var batchMode = !globalConfiguration['noBatch'];
+    var dart2jsBatchMode = globalConfiguration['dart2js_batch'];
 
     if (command is BrowserTestCommand) {
       return _startBrowserControllerTest(command, timeout);
+    } else if (command is CompilationCommand && dart2jsBatchMode) {
+      return _getBatchRunner("dart2js")
+          .runCommand("dart2js", command, timeout, command.arguments);
     } else if (command is AnalysisCommand && batchMode) {
       return _getBatchRunner(command.flavor)
           .runCommand(command.flavor, command, timeout, command.arguments);
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index b87d7ea..a0a3f73 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -402,7 +402,10 @@
      *      third_party/pkg/PACKAGE_NAME
      */
 
-    isValid(packageName) => packageName != 'third_party';
+    // Directories containing "-" are not valid pub packages and we therefore
+    // do not include them in the list of packages.
+    isValid(packageName) =>
+        packageName != 'third_party' && !packageName.contains('-');
 
     var dartDir = TestUtils.dartDir;
     var futures = [
@@ -2132,8 +2135,10 @@
           "the-steps-to-clone-a-node_": "co19_htmltemplates_clone_",
       "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_"
       "caretRangeFromPoint-": "co19_caretrangefrompoint_",
-      "pkg_polymer_example_canonicalization_test_canonicalization":
-          "polymer_c16n"
+      "pkg_polymer_e2e_test_canonicalization_test": "polymer_c16n",
+      "pkg_polymer_e2e_test_experimental_boot_test": "polymer_boot",
+      "pkg_polymer_e2e_test_bad_import_test": "polymer_bi",
+      "pkg_polymer_e2e_test_good_import_test": "polymer_gi",
     };
 
     // Some tests are already in [build_dir]/generated_tests.
@@ -2143,7 +2148,7 @@
       path = 'multitest/${path.substring(index)}';
     }
     path = path.replaceAll('/', '_');
-    final int WINDOWS_SHORTEN_PATH_LIMIT = 60;
+    final int WINDOWS_SHORTEN_PATH_LIMIT = 58;
     if (Platform.operatingSystem == 'windows' &&
         path.length > WINDOWS_SHORTEN_PATH_LIMIT) {
       for (var key in PATH_REPLACEMENTS.keys) {
diff --git a/tools/utils.py b/tools/utils.py
index bbba2a4..43947b5 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -217,6 +217,7 @@
   'ia32': 'ia32',
   'x64': 'ia32',
   'arm': 'arm',
+  'arm64': 'arm',
   'mips': 'mips',
   'simarm': 'ia32',
   'simmips': 'ia32',